Создание и использование статической библиотеки в xcode - PullRequest
3 голосов
/ 28 марта 2010

Я пытаюсь создать статическую библиотеку в 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.h

extern int testFunction();

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

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

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. Я действительно ценю любую помощь.

Ответы [ 2 ]

1 голос
/ 28 марта 2010

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

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

#ifdef __cplusplus
extern "C" {
#endif

int testFunction();

#ifdef __cplusplus
}
#endif

Смотри, например, облегченная запись C ++ FAQ для более подробной информации.

1 голос
/ 28 марта 2010

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

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

...