2010-06-14 81 views
2

我現在處於鏈接器天堂。我有一個C庫,只有編譯在Visual C++(它可能是在海灣合作委員會的工作),如果:鏈接到編譯爲C++的C庫

  1. 我編譯爲C++代碼
  2. 定義__cplusplus這將導致所有聲明被封裝在extern "C" { }

所以,這樣做我有一個叫,比如靜態庫,bsbs.lib

現在,我有一個C++項目稱爲Tester哪想調用函數在bsbs.h中聲明的。一切順利的罰款,直到我嘗試,我得到了所有太熟悉的鏈接到bsbs.lib

Tester.obj : error LNK2001: unresolved external symbol _foofoo 

而且這似乎總是foofoo不能得到解決,無論哪個函數我稱之爲Testerbarbar或還要別的嗎)。

更新:我已根據要求對第2點進行了擴展。非常感謝幫助傢伙!

#ifndef _BSBS_H 
#define _BSBS_H 

/* Prevent C++ programs from name mangling these definitions. */ 
#ifdef __cplusplus 
extern "C" { 
#endif 

#include <stdio.h> 
#include <setjmp.h> 
....... 
....... 
#ifdef __cplusplus 
} 
#endif 

#endif /* _BSBS_H */ 

這就是「主」頭文件,可以這麼說。所有重要的功能都在這裏。但是還有其他頭文件bsbs.c所調用的文件是而不是包含在extern "C" {}中。

解決: OK,這是很奇怪的,但我刪除從bsbs頭文件extern C位,編譯它作爲一個C++項目(即使所有的文件都.c並刪除了__cplusplus定義)和有效!我在看符號列表後看到了這個想法。除之外的所有東西都被毀壞了,其中包含extern C(doh)中的那些,並且它要求一個未摺疊的符號,所以我認爲有些問題是不對的。

+1

而且您沒有在測試器代碼中的任何地方引用「_foofoo」? – 2010-06-14 21:13:29

+0

你在第二點意味着什麼 - 我認爲我們需要看到一些代碼,因爲這可能是錯誤的 – Mark 2010-06-14 21:15:05

+1

在你丟失的第三個庫中,'foofoo'是否存在,即bsbs.lib'需要別的東西嗎? – 2010-06-14 21:16:34

回答

2

如果您在lib中聲明它們爲extern C(如果您從C++調用它們,那麼這是不必要的),那麼它們必須在頭文件中是extern C.

+0

但不是在'Tester'的C++頭文件中,對吧? – Jacob 2010-06-14 22:43:33

+0

如果他們是外部C,他們是外部C.你不能混合和匹配。如果lib將它們作爲extern C導出,那麼你必須將它們作爲extern C導入它們。 – Puppy 2010-06-14 22:47:12

0

我假設你已經添加了一個鏈接器引用。例如:

#pragma comment(lib, "bsbs.lib") 
+0

嗯,我在其他地方定義了輸入庫,所以它讀取'bsbs.lib' – Jacob 2010-06-14 22:41:53

2

在鏈接中可能不存在c庫中的依賴項。您所包含的c庫是否真的包含對DLL的引用?如果是這樣,有一個名爲'depends'的程序,它會告訴你其他所需的DLL是什麼。

+0

我不這麼認爲,因爲'foofoo'是在'bs​​bs.lib'中定義的,它似乎是獨立的。 – Jacob 2010-06-14 22:40:12

0

也許編譯器/鏈接器組合需要知道哪些API將被導出/導入?如果是這樣,我會嘗試將相應的__declspec(例如,dllimport和/或dllexport)添加到C++庫。

0

您的lib文件是否導入任何其他lib文件?你可以編譯一個lib文件來顯式鏈接lib文件或隱式地。一種方法是將lib文件放在一個巨大的球中,另一種方式是將它們作爲單獨的庫,在編譯時在最終應用程序中都需要鏈接。如果foofoo從另一個lib文件導入到lib文件中,那麼將該lib文件包含在最終項目中。這是我所描述的最好的猜測,也是迄今爲止我在通過同事處理lib文件時被問到的最常見的事情。

+0

我不認爲是這種情況,因爲'foofoo'似乎完全定義了。 – Jacob 2010-06-14 22:42:59