2016-08-15 3 views
0

Я пытаюсь скомпилировать простую программу FLTK, но она всегда вызывает ошибку ссылки. Когда я строю с этой командой, она работаетfltk cmake ubuntu ссылка ошибка

g++ -I/usr/local/include \ 
    -I/usr/include/freetype2 \ 
    -D_LARGEFILE_SOURCE \ 
    -D_LARGEFILE64_SOURCE \ 
    -D_THREAD_SAFE \ 
    -D_REENTRANT \ 
    -o 'ex01' './ex01.cxx' /usr/local/lib/libfltk.a \ 
    -lXcursor -lXfixes -lXext -lXft -lfontconfig \ 
    -lXinerama -lpthread -ldl -lm -lX11 

, когда я пытаюсь CMake с этими линиями:

CMAKE_MINIMUM_REQUIRED(VERSION 3.6.1) 
PROJECT(ex01) 
FIND_PACKAGE(FLTK REQUIRED) 
FIND_PACKAGE(OpenGL REQUIRED) 
ADD_EXECUTABLE(ex01 ex01.cxx) 
TARGET_INCLUDE_DIRECTORIES(ex01 PUBLIC ${FLTK_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) 
TARGET_LINK_LIBRARIES(ex01 ${FLTK_LIBRARIES} ${OPENGL_LIBRARIES}) 

Я получаю эту ошибку:

[100%] Linking CXX executable ex01 
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libfltk.a(Fl_x.o): undefined reference to symbol '[email protected]@GLIBC_2.2.5' 
//lib/x86_64-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line 
collect2: error: ld returned 1 exit status 
make[2]: *** [ex01] Error 1 
make[1]: *** [CMakeFiles/ex01.dir/all] Error 2 
make: *** [all] Error 2 

Моя система имеет Ubuntu 14 и CMake 3.6.1. Любое предложение? есть ли способ добавить предыдущие параметры g ++ в файл CMakeLists.txt? Большое спасибо! Ibraheem

+0

Возможно, вы также забыли добавить препроцессор. Проверьте это с помощью подробного запуска cmake/make, чтобы увидеть фактические вызовы компилятора. Для указания определений вам понадобится ['target_compile_definitions()'] (https://cmake.org/cmake/help/v3.5/command/target_compile_definitions.html). –

+0

Еще раз спасибо. target_compile_definitions() нуждается в микросах. Вместо этого я использовал TARGET_COMPILE_OPTIONS (ex01 PUBLIC -lXcursor -lXfixes -lXinerama -lpthread -ldl -lm -lX11) , но все равно получал ту же ошибку – Ibraheem

+0

'target_compile_definitions' и' target_compile_options' - это две совершенно разные вещи. Я обновляю свой ответ. Все эти '-l ...', которые вы вручную добавляете, уже должны покрываться '$ {FLTK_LIBRARIES}' и '$ {OPENGL_LIBRARIES}'. –

ответ

0

Вы не сложение включает каталогов для зависимых библиотек FLTK и OpenGL. Эти переменные предоставляют модули Find.

Использование target_include_directories():

target_include_directories(ex01 
          PUBLIC ${FLTK_INCLUDE_DIR} 
            ${OPENGL_INCLUDE_DIR}) 

Edit:
Кроме того, отсутствуют определения препроцессора

-D_LARGEFILE_SOURCE 
-D_LARGEFILE64_SOURCE 
-D_THREAD_SAFE 
-D_REENTRANT 

Вы должны определить их для исполняемого файла с помощью target_compile_definitions():

target_compile_definitions(ex01 
          PUBLIC _LARGEFILE_SOURCE 
            _LARGEFILE64_SOURCE 
            _THREAD_SAFE 
            _REENTRANT) 

Для любого дальнейшего использования отладки CMake CMAKE_VERBOSE_MAKEILFEmake, чтобы распечатать вызовы компилятора. Это скажет вам, что еще не хватает.


Side Примечание: вам действительно нужно требовать CMake 2.6 ли? До тех пор, пока вам не нужно поддерживать системы, которые не предоставляют недавний CMake, я бы рекомендовал не менее CMake версии 3.0.

+0

Спасибо за ваш ответ, я попробовал ваше решение, но теперь я получаю эту ошибку: Ошибка CMake в CMakeLists.txt: 13 (TARGET_INCLUDE_DIRECTORIES): target_include_directories, вызываемые с недопустимыми аргументами. – Ibraheem

+0

Извините, прикрутил синтаксис. Починил это. В любом случае, вы должны прочитать эту документацию! –

+0

Еще раз спасибо, я попробовал новый синтаксис, но теперь вернулся к предыдущей ошибке. Я обновил содержание в вопросе. – Ibraheem

0

Мне нужна помощь здесь: https://groups.google.com/forum/#!topic/fltkgeneral/GWlW6KiYnKM Теперь это работает :). Мне пришлось: 1- загрузить и построить последнюю версию fltk с помощью cmake. 2-change CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 3.6) PROJECT(ex01) FIND_PACKAGE(FLTK REQUIRED NO_MODULE) # must use "NO_MODULE" include_directories(${FLTK_INCLUDE_DIRS}) link_directories(${FLTK_LIBRARY_DIRS}) add_definitions(${FLTK_DEFINITIONS})
ADD_EXECUTABLE(ex01 ex01.cxx) TARGET_LINK_LIBRARIES(ex01 fltk) # notice fltk here

Смежные вопросы