2010-03-28 64 views
3

我正在嘗試在xcode中創建一個靜態庫,並從另一個程序鏈接到該靜態庫。在xcode中創建和使用靜態庫

所以,作爲一個測試,我創建了一個BSD靜態C庫項目和剛添加以下代碼:

//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(); 

我對上項目的點擊 - >添加 - >現有框架 - >添加其他 選擇了某文件並把它添加入親項目視圖。

我總是得到這個連接錯誤:

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++。我可能錯過了相當明顯的東西,我所有的經驗都來自在Windows平臺上創建dll。 我真的很感激任何幫助。

回答

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。 – 2010-03-28 18:35:25

+0

對,我重讀了它的'Test.cpp' - 澄清了。 – 2010-03-28 19:03:18

+0

是的你的權利我把它稱爲Test.c而不是Test.cpp,對不起沒有意識到我犯了這樣一個愚蠢的錯誤。 – 2010-03-28 19:16:19

1

您不會將庫(.a文件)添加爲框架 - 它只是一個庫 - 將其添加到項目中,就像添加源文件一樣。

另請注意,您不需要Testlib.h - 只需#include原始Test.hmain.cpp

+0

感謝您的回答,但是 無論我使用add框架添加框架還是將其添加爲好像我將源文件添加它,結果都是相同的。仍然得到相同的鏈接錯誤。 我最初直接連接到.h文件,但認爲這可能是導致此錯誤的原因,所以我將其更改爲這種方式,但結果相同。但是,我會改回直接連接它,因爲我不想更改2個頭文件。這種方式應該仍然是一樣的權利? – 2010-03-28 17:03:12

+0

小的一點 - 你不*鏈接到頭文件(.h文件) - 你只是#包括它們。問題:你想讓你的靜態庫有一個C API或C++ API嗎? – 2010-03-28 18:39:38

+0

對不起,我不是指鏈接,我的意思是將它們添加到xcode項目中。最後,我希望它有一個調用ObjC函數的C API,所以我可以將它鏈接到一個C++項目中。因此,C++代碼將調用靜態庫中的C函數,然後調用lib中包含的objC代碼。這只是一個測試,看看我是否可以在沒有objC的情況下正常使用靜態庫。 – 2010-03-28 19:11:09