2010-03-28 3 views
3

Я пытаюсь создать статическую библиотеку в xcode и ссылку на эту статическую библиотеку из другой программы.Создание и использование статического lib в xcode

Так как тест я создал статический проект библиотеки C BSD и просто добавил следующий код:

//Test.h

int testFunction(); 

//Test.cpp

#include "Test.h" 
int testFunction() { 
return 12; 
} 

Это компилируется и создает файл .a (libTest.a).

Теперь я хочу, чтобы использовать его в другой программе, поэтому я создаю новый Xcode проекта (приложение какао) следующий код:

//main.cpp

#include <iostream> 
#include "Testlib.h" 

int main (int argc, char * const argv[]) { 
    // insert code here... 
    std::cout << "Result:\n" <<testFunction(); 
    return 0; 
} 

// Testlib. ч

extern int testFunction(); 

я право нажал на проекте -> добавить -> существующие рамки -> добавить другие Выбранный файл .a и добавили его в про ject.

Я всегда получаю эту ошибку компоновщика:

Build TestUselibrary of project TestUselibrary with configuration Debug 

Ld build/Debug/TestUselibrary normal x86_64 
cd /Users/myname/location/TestUselibrary 
setenv MACOSX_DEPLOYMENT_TARGET 10.6 
/Developer/usr/bin/g++-4.2 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk 
-L/Users/myname/location/TestUselibrary/build/Debug 
-L/Users/myname/location/TestUselibrary/../Test/build/Debug 
-F/Users/myname/location/TestUselibrary/build/Debug 
-filelist /Users/myname/location/TestUselibrary/build/TestUselibrary.build/Debug/TestUselibrary.build/Objects-normal/x86_64/TestUselibrary.LinkFileList 
-mmacosx-version-min=10.6 -lTest -o /Users/myname/location/TestUselibrary/build/Debug/TestUselibrary 



Undefined symbols: 
    "testFunction()", referenced from: 
     _main in main.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

Я новичок в MacOSX развития и достаточно новый для C++. Я, вероятно, пропустил что-то довольно очевидное, весь мой опыт связан с созданием dll на платформе Windows. Я очень ценю любую помощь.

ответ

1

Вы уверены, что исходный файл библиотеки указан Test.cpp, а не Test.c? С .c я получаю точно такую ​​же ошибку.

Если это Test.c, то вам нужно добавить extern "C" в заголовок для C++. Например:

#ifdef __cplusplus 
extern "C" { 
#endif 

int testFunction(); 

#ifdef __cplusplus 
} 
#endif 

См., Например, C++ FAQ lite entry для более подробной информации.

+1

Ему не нужно это делать, так как библиотека и тестовый жгут являются .cpp. –

+0

Правильно, я перепробовал, что его 'Test.cpp' - уточнили. –

+0

Да, ваше право Я назвал его Test.c вместо Test.cpp, извините, не понял, что совершил такую ​​глупую ошибку. –

1

Вы не добавляете библиотеку (.a файл) в качестве рамки - это просто библиотека - добавьте ее в проект, как если бы вы добавили исходный файл.

Также обратите внимание, что вам не нужно Testlib.h - всего #include оригинал Test.h в main.cpp.

+0

Спасибо за ваш ответ, но Он имеет тот же результат, добавляю ли я его с помощью add framework или добавляю его, как если бы я был исходным файлом. Все равно получите ту же ошибку связывания. Я изначально связался прямо с файлом .h, но думал, что это может быть причиной этой ошибки, поэтому я изменил ее таким образом, но тот же результат. Но да, я вернусь к ссылке прямо на него, так как я не хочу менять 2 файла заголовка. Этот путь должен работать одинаково? –

+0

Маленькая точка - вы не * ссылку * на файлы заголовков (файлы .h) - вы просто # включите их. Вопрос: вы хотите, чтобы ваша статическая библиотека имела API C или API C++? –

+0

Ах, извините, я не имел в виду ссылку, я просто хотел добавить их в проект xcode.В конце концов, я хочу, чтобы у него был API C, который вызывает функции ObjC, поэтому я могу связать его в проекте C++. Таким образом, код C++ вызывает функции C в статической библиотеке lib, которая затем вызывает код objC, содержащийся в lib. Это был просто тест, чтобы увидеть, могу ли я заставить обычные статические библиотеки работать без objC. –

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