簡體   English   中英

VS2008未鏈接到庫中的所有功能

[英]VS2008 not linking to all functions in a library

我們的項目是一個基於VS2008的項目,大量使用Boost和Qt。 但是,今天我們有了一個新的鏈接問題,它沒有任何意義。

發生的是在鏈接期間

  • 對於程序A,我們的靜態庫Foobar正在查找到8個成員函數中的5個的鏈接。
  • 對於程序FoobarUnitTest,Foobar中的所有內容都可以鏈接並正常運行。
  • 對於程序B,我們的庫Foobar2是DLL。 在鏈接期間,它將查找除構造函數和析構函數以外的所有成員函數。

當我說鏈接器找到一些成員函數時,我所做的是使用/ VERBOSE選項進行鏈接。 然后,我去檢查了生成的buildlog.htm文件,可以看到鏈接器在哪里從庫中找到了一些功能。 鏈接器錯誤為“錯誤LNK2019:外部未解決”

同樣,在32位或64位上也會發生相同的事情-調試或發布模式。

關於到哪里看有什么建議嗎?

對於這樣一個模糊的問題,很難給出任何有意義的建議,但是這里有幾件事需要檢查。 當標頭中說有一個名為“ x :: y()”的函數但未在lib文件中找到該函數時,鏈接器報告“未解析的外部函數”。 請記住,這假設您實際上已經實現了所考慮的功能。 最終,無論問題最終出在哪里,它都將是“您告訴我有一個名為x :: y()的函數,但是您沒有實現名為x :: y()的函數”的某種形式。

因此,第零步是確保您實際上已經實現了這些功能。 好的,假設您有。

第1步確保在庫的實現中確保要進行declspec(__dllexport)的功能,並在客戶端上進行declspec(__dllimport)的功能。 我為此使用宏:

MyFancyLib.h:

#ifndef MYLIB_API
#  define MYLIB_API (declspec(__dllimport))
#endif

MYLIB_API void DoIt();

MyFancyLib.CPP:

// this should be moved to stdafx.h or something sufficiently low-level
#define MYLIB_API (declspec(__dllexport))

MYLIB_API void DoIt()
{
  // magic happens
}

第2步:確保你真的在執行命名的東西正確。 我最常見的錯誤之一是聲明一個類或名稱空間的成員函數,例如, namespace Foo { void DoIt(); }; namespace Foo { void DoIt(); }; ,然后忘記對實現中的類或名稱空間進行完全限定。 如果您從未在實現中調用該函數,則鏈接器可能永遠都不會尋找它。

MyLib.h:

namespace lib
{
  MILIB_API void DoIt();
};

MyLib.cpp:

MYLIB_API void DoIt()
{
  // magic happens
};

這將生成未解決的外部。 CPP應該如下所示:

MyLibCorrect.cpp:

MYLIB_API void mylib::DoIt()
{
  // magic
}

第3步:確保您已鏈接到需要鏈接的所有內容。 這似乎更像是第0步或第1步,但是如果您已鏈接到您認為所需的所有內容,則此步驟可能會很困難。 查看鏈接器抱怨的名稱,對其進行一些修飾,然后在庫的代碼中搜索這些功能的實現。 您可能會發現它們是從您認為不是從其導出的項目中導出的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM