2013-03-03 5 views
6

У меня есть статическая библиотека mylib, которая зависит от математической библиотеки.CMake: правильно связать системную библиотеку с помощью gcc

Если я первый ссылка MyLib с математикой, а затем на мой исполняемый файл работает:

add_executable(myapp main.c) 
target_link_libraries(mylib m) 
target_link_libraries(myapp mylib) 

Но если я делаю ссылку непосредственно с исполняемым он терпит неудачу при использовании GCC

(с лязгом он работает!)
add_executable(myapp main.c) 
target_link_libraries(myapp m mylib) 

Почему это имеет значение?
Я думал, что в любом случае невозможно связать библиотеки вместе?

ответ

6

При использовании cmake's target_link_libraries это не значит, что вы что-то свяжете. Это скорее создаст зависимость между target и library типа/действия link.

Я думаю, что на самом деле построить линию первого примера приведет к чему-то вроде этого:

gcc -o myapp myapp.o -lmylib -lm 

и второй

gcc -o myapp myapp.o -lm -lmylib 

. Если mylib имеет ссылки на m, второй пример (возможно) не ссылки.

Попробуйте запустить make VERBOSE=1 и изучите командную строку процесса связи, чтобы действительно понять, что происходит. Компилятор clang, возможно, интеллектуальный и ожидает, что все вызовы будут связаны до фактического удаления библиотеки во время процесса ссылки.

+0

Я думаю, что вы правы - gcc, кажется, бросает библиотеки во время ссылки, если они не предоставляются после двоичного файла. Если я изменю команду на 'target_link_libraries (myapp mylib m)' она работает! – mirkokiefer

+0

Вы использовали make VERBOSE = 1 с clang? –

+0

Да, я попробовал - см. Мой ответ. Спасибо за вашу помощь! – mirkokiefer

0

При использовании target_link_libraries важно, в каком порядке указываются связанные библиотеки.

Это не работает при использовании GCC (по крайней мере, в v4.6.3):

target_link_libraries(myapp m mylib) 

в то время как это работает:

target_link_libraries(myapp mylib m) 

Так все библиотеки MyLib зависит должны прийти после MyLib.

Если отследить фактический компоновщик вызов с make VERBOSE=1 вы найдете это за разбитый пример:

gcc main.c.o -o luatest -rdynamic -lm mylib.a 

и это для работающих один:

gcc main.c.o -o luatest -rdynamic mylib.a -lm 

, ссылающегося лязга с точно таким же параметры работают в обоих случаях!

Так @PatrickB, похоже, прав:

линкер лязгом, может быть, умный и ждет все вызовы будут связаны, прежде чем на самом деле сбросив библиотеку во время установления связи процесса.

+0

Вы должны, вероятно, отметить ответ @Patrick B. как правильный, тогда :-) – Fraser

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

  • Нет связанных вопросов^_^