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

标签 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,但是因为我还有其他依赖项等,所以它刚开始把所有东西弄乱了。

我在库中 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/

相关文章:

delphi - 将 delphi win32 应用程序转换为库和 FreeLibrary 卡住

c++ - 不能使用我自己的使用 SFML 的 DLL

c++ - '*' token 之前的预期初始值设定项

c++-cli - 如何修复 fatal error C1113 : #using failed on 'Mylib.lib'

c++ - std::string 可以跨 DLL 边界按值传递吗?

c++ - Qt Creator 在步骤 'make' 编译错误

scala - 我可以强制 Scala 在不详尽的比赛中出错吗?

java - 如何在动态类型语言(即 Python)中指定参数类型?

c# - 覆盖静态类成员并通过泛型访问

c++ - 在 cpp 中声明为静态的动态增长 vector