2012-01-18 3 views
1

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

Код состоит из источников 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

Используйте 'g ++ -v', чтобы понять, что на самом деле делает' g ++ '. –

+0

Ваша структура каталогов поможет, это ваш файл .so в ./lib (относительно вашего Makefile)? – xpapad

+0

Да, он есть. В противном случае линкер будет жаловаться, я полагаю. кроме того, это должен быть комментарий, а не ответ. –

ответ

2

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

Я подозреваю, что вам может быть недостает extern "C" { ... } охранников вокруг вашего C-заголовка.

+0

В этом случае, спасибо! –

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