我正在尝试编译项目,并将其与之前编译的静态库链接。
我的文件编译了,但是没有链接。
我收到这些消息(我将其截断,否则太长):
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,但是因为我还有其他依赖项等,所以它刚开始把所有东西弄乱了。
我在库中 checkin ,符号在那里,但没有__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将是一个动态库。
最佳答案
我终于明白了。
事实证明,编译器无法提前知道我是否要将FLANN与静态或动态库链接。
因此,我研究了FLANN库本身,并在其深处有一个MACRO(FLANN_STATIC)应该作为编译定义(cmake中的target_compile_definitions)传递,以使编译器知道它将是一个静态库(如我们所说,通过默认情况下,假设它将是一个动态库)。
然后我必须添加到我的CMakeLists.txt文件中。
target_compile_definitions(files.lib PUBLIC FLANN_STATIC)
而且有效。
我知道没有人回答,但是花了我几个小时才找到它,所以希望有一天,它可以节省别人的时间!
关于dll - 静态链接搜索动态符号(VS 2015),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51576035/