C: неопределенная ссылка ... на библиотеку, успешно использованную в другом месте - PullRequest
1 голос
/ 18 января 2012

Я пытаюсь скомпилировать проект C ++ (openFrameworks + CodeBlocks), используя внешнюю библиотеку C.Я получаю ошибку «неопределенная ссылка», хотя я успешно скомпилирую и использую библиотеку в другом месте.

Код состоит из исходных файлов main.cpp, testApp.cpp и заголовочных файлов, включая один для моей библиотеки «myprocessing».Когда я make, код компилируется и умирает при связывании с ошибкой

obj/i686Release/./src/testApp.o: In function `testApp::update()':
testApp.cpp:(.text+0x261): undefined reference to `gauss_5(datarect_t)'
collect2: ld returned 1 exit status
make: *** [bin/faceGrabber] Error 1

, где gauss_5 - это моя библиотечная функция, и она вызывается в testApp.cpp (там включен заголовок с объявлениями).

Ниже я вставляю команды make, используемые для компиляции кода, сгенерированного CodeBlocks (для ясности я обрезал)

# compiling object for:  ./src/testApp.cpp

g++ -c -g  [some -I...] -DOF_USING_GTK -DOF_USING_MPG123 -Wall 
  -fexceptions -I.  -Ilib/ -MMD -MP -MFobj/i686Debug/./src/testApp.d 
  -MTobj/i686Debug/./src/testApp.d -oobj/i686Debug/./src/testApp.o 
  -c ./src/testApp.cpp

# compiling object for:  ./src/main.cpp

g++ -c -g -pthread [some -I...]  -DOF_USING_GTK -DOF_USING_MPG123
  -Wall -fexceptions -I.   -Ilib/ -MMD -MP -MFobj/i686Debug/./src/main.d
  -MTobj/i686Debug/./src/main.d -oobj/i686Debug/./src/main.o
  -c ./src/main.cpp

# linking bin/faceGrabber_debug . ./src ./lib

g++ -o bin/faceGrabber_debug obj/i686Debug/./src/testApp.o
  obj/i686Debug/./src/main.o   -Wl,-rpath=./libs -Llib/ -lz
  -lmyprocessing [some libs...]

Обратите внимание, что на мою библиотеку ссылаются (-lmyprocessing) в последнем шаге связывания.Таким образом, все заголовки и библиотеки находятся компилятором, но почему-то они не компилируются.

Я попытался использовать .a статические и .so динамические файлы для моей обработки, но безуспешно.Как я уже упоминал, я использую ту же библиотеку в другом проекте (за исключением openFrameworks и CodeBlocks), и она работает.

1 Ответ

2 голосов
/ 18 января 2012

Вы говорите, что библиотека написана на C. Однако тот факт, что компоновщик может распечатать тип аргумента для gauss_5(), предполагает, что он работает с искаженным именем функции на C ++.

Я подозреваю, что вам не хватает extern "C" { ... } охранников вокруг заголовка C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...