静态链接搜索动态符号(VS 2015)

时间:2018-07-28 23:31:42

标签: dll compiler-errors static linker

我正在尝试编译项目并将其与我之前编译过的静态库链接。 我的文件可以编译,但是没有链接。

我收到这些消息(我将其截断了,否则太长了):

error LNK2019: unresolved external symbol __imp_flann_build_index referenced in function ....
error LNK2019: unresolved external symbol __imp_flann_find_nearest_neighbors_index referenced in function ...
error LNK2019: unresolved external symbol __imp_flann_free_index referenced in function ...
error LNK2019: unresolved external symbol __imp_DEFAULT_FLANN_PARAMETERS referenced in function ...

据我了解,__ imp_符号表示链接器正在尝试查找dll。但是,我将该库编译为静态库,并且正确设置了“其他库目录”和“其他依赖项”。

我的库使用/ MD作为可执行文件进行编译。我试图切换到/ MT,但是因为我还有其他依赖项等,所以它刚开始把所有东西搞砸了。

我在库中签到并且有符号,但是没有__imp_前缀。

我还将库放在最后,因此它应该解析符号,但是仍然无法正常工作。

我不知道这是怎么回事。欢迎任何帮助。

谢谢。

编辑:实际上,这比我提到的要简单一些。这是我所拥有的:

FLANN library ---> file1.cpp  --
                   file1.h     | ---> files.lib ----    
                   file2.cpp   |                   |
                   file2.h    --                   |---> program.exe
FLANN.lib ------------------------------------------

基本上,我有使用FLANN库的文件(包括FLANN库的标题和调用函数)。我想创建这些文件的静态库,并将其链接到myprogram.exe(这是我前面提到的错误的出处)。 但是我注意到在files.lib中已经有符号__imp_。我不明白为什么它在那里使用动态符号。

我要尝试的是告诉files.lib使用FLANN.lib的静态符号,因为这是我将myprogram.exe链接到的内容,但是到目前为止,链接器似乎并不在意,并假设FLANN将是一个动态库。

1 个答案:

答案 0 :(得分:0)

我终于明白了。

事实证明,编译器无法预先知道我是否要将FLANN与静态或动态库链接。

所以我研究了FLANN库本身,然后深入到那里,有一个MACRO(FLANN_STATIC)应该作为编译定义(在cmake中为target_compile_definitions)传递,以使编译器知道它将是一个静态库(因为我们例如,默认情况下,它将假设它是一个动态库。

然后我必须添加到files.lib的CMakeLists.txt中:

target_compile_definitions(files.lib PUBLIC FLANN_STATIC)

成功了。 我知道没有人回答,但是花了我几个小时才找到它,所以希望有一天,它可以节省一个人的时间!!