2016-11-29 2 views
1

Чтобы это было просто ... предположим, что у меня есть следующее: A.lib, libB.so (который использует A.lib) и C.exe (который использует libB. так). Примечание. Это Linux, а не Windows. Я просто использую .exe для передачи двоичного типа/цели.Ссылка на .so в g ++ приводит к неопределенным ссылкам

Я просто пытаюсь скомпилировать и связать C.exe в командной строке, поскольку это просто простая тестовая программа. Это линия Я использую:

g++ -I../include C.cpp -o C.exe -L../lib -lB 

В результате многие неопределенные ссылки на вещи, которые будут найдены в A.lib. Нет ошибок, ссылающихся на что-либо, экспортированное из libB.so.

Если скопировать libB.so в тот же каталог, и использовать эту команду:

g++ -I../include C.cpp -o C.exe -lB 

В результате c.exe построен и может работать без ошибок.

После сборки libB.so мне не нужны библиотеки, которые использовались для его создания. Несмотря на это, я решил попробовать что-то в качестве последней попытки. Я скопировал A.lib в тот же каталог lib, что и libB.so, и снова попробовал исходную команду сборки. Результат был тот же.

Все мысли оценены.

+0

Как вы хотели бы связать 'libB.so'? Вы явно ссылались на 'A.lib'? –

+0

Используйте опцию '-R', в дополнение к' -L'. Для получения дополнительной информации см. Справочную страницу 'ld'. –

+0

Кстати, библиотека 'A' ​​* статическая * библиотека или * динамическая * библиотека? –

ответ

0

СамВершавчик поставил меня на путь ответа. Я пробовал эту команду сначала:

g++ -I../include C.cpp -o C.exe -Wl,-R,../lib -lB 

В результате была чистая сборка, но еще одна ошибка пропущенных символов при запуске C.exe.

Я изменил команду следующее:

g++ -I../include C.cpp -o C.exe -Wl,-R,--just-symbols=../lib/libB.so -lB 

Это привело к чистой сборки и возможность запуска c.exe без ошибок.

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