我正在尝试编译项目并将其与我之前编译过的静态库链接。 我的文件可以编译,但是没有链接。
我收到这些消息(我将其截断了,否则太长了):
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将是一个动态库。
答案 0 :(得分:0)
我终于明白了。
事实证明,编译器无法预先知道我是否要将FLANN与静态或动态库链接。
所以我研究了FLANN库本身,然后深入到那里,有一个MACRO(FLANN_STATIC)应该作为编译定义(在cmake中为target_compile_definitions)传递,以使编译器知道它将是一个静态库(因为我们例如,默认情况下,它将假设它是一个动态库。
然后我必须添加到files.lib的CMakeLists.txt中:
target_compile_definitions(files.lib PUBLIC FLANN_STATIC)
成功了。 我知道没有人回答,但是花了我几个小时才找到它,所以希望有一天,它可以节省一个人的时间!!