g cc соединение с динамическими c библиотеками, неопределенная ошибка ссылки - PullRequest
0 голосов
/ 18 марта 2020

Я делаю программу, которая должна быть связана со сторонним SDK, который поставляется в форме заголовочных файлов и предварительно скомпилированных общих библиотек.

Сама программа проста, она просто вызывает одну функцию из библиотеки:

#include <dhnetsdk.h>

int main() {
    CLIENT_Init(nullptr, 0);
}

Затем я компилирую ее с помощью

g++ -std=c++17 -O3 -ldhnetsdk -lavnetsdk -ldhconfigsdk -lInfra -lNetFramework -lStream -lStreamSvr trigger/src/main.cpp -Lsdk/bin -Isdk/include

sdk / bin содержит. поэтому файлы и sdk / include содержат файл dhnetsdk.h, где CLIENT_Init объявлен как extern "C" int CLIENT_Init(void(*)(long long, char*, long), long);

Я проверил с помощью nm, а sdk / bin / libdhnetsdk.so действительно экспортирует символ CLIENT_Init , но по какой-то причине компоновщик не может найти его и терпит неудачу с:

/usr/bin/ld: /tmp/ccovgfxa.o: in function `main':
main.cpp:(.text.startup+0x9): undefined reference to `CLIENT_Init'
collect2: error: ld returned 1 exit status

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

В конце я узнал, что все дело в порядке, и мне нужно было поставить src / trigger / main. cpp перед всеми библиотеками, которые решили проблему.

0 голосов
/ 18 марта 2020

Для заказа вы предоставляете библиотеки для ссылки, вероятно, неправильно. См., Например, этот ответ: { ссылка }.

Теперь вы можете попытаться выяснить, в каком порядке должны быть аргументы -l. Или пусть ld выяснит это с помощью создание группы библиотек. ld будет искать в этой группе, пока не найдет необходимую функцию (или определит, что она недоступна). Это делается с помощью параметров ld --start-group и --end-group:

g++ -std=c++17 -O3 -Lsdk/bin -Isdk/include trigger/src/main.cpp \
  -Wl,--start-group -ldhnetsdk -lavnetsdk -ldhconfigsdk -lInfra \
    -lNetFramework -lStream -lStreamSvr -Wl,--end-group

Редактировать: Исправлено, поэтому исходный файл предшествовал библиотекам.

...