xmake-io / xmake

🔥 A cross-platform build utility based on Lua
https://xmake.io
Apache License 2.0
10.04k stars 786 forks source link

add_links 试图打开 .lib 而不是生成的 lib***.dll #1708

Closed oridong closed 3 years ago

oridong commented 3 years ago

win10

xmake v2.5.5+202107010703, vscode-xmake 1.4.5 vscode 终端报错: checking for Microsoft Visual Studio (x64) version ... 2017 [ 50%]: linking.release libTransform3D.dll [ 50%]: linking.release libTransform6D.dll error: LINK : fatal error LNK1181: 无法打开输入文件“Transform3D.lib”

xmake.lua文件主要内容

target("libTransform3D") set_kind("shared") add_files("Euclidean3D/Transform3D.cpp") -- 这个在 ../xmake_target 中生成了 libTransform3D.dll 动态库

target("libTransform6D") set_kind("shared") add_files("Spatial6D/Transform6D.cpp") add_links("Transform3D") add_linkdirs("../xmake_target") -- 报错: error: LINK : fatal error LNK1181: 无法打开输入文件“Transform3D.lib” -- add_links("Transform3D") 怎么设置是 打开输入文件 libTransform3D.dll 而不是 Transform3D.lib

waruqi commented 3 years ago

-- add_links("Transform3D") 怎么设置是 打开输入文件 libTransform3D.dll 而不是 Transform3D.lib

dll 是没法 link 的。只能 link .dll 对应的导出库 .lib

首先确认代码有没有设置符号导出,有符号导出,才能自动生成dll 对应的 lib 库

然后走 add_deps() 自动关联依赖,会自动 link 对应的 lib

oridong commented 3 years ago

-- add_links("Transform3D") 怎么设置是 打开输入文件 libTransform3D.dll 而不是 Transform3D.lib

dll 是没法 link 的。只能 link .dll 对应的导出库 .lib

首先确认代码有没有设置符号导出,有符号导出,才能自动生成dll 对应的 lib 库

然后走 add_deps() 自动关联依赖,会自动 link 对应的 lib

没有符号导出 该怎么办呢? 只有生成的.dll ,libTransform6D.dll 依赖libTransform3D.dll

waruqi commented 3 years ago

-- add_links("Transform3D") 怎么设置是 打开输入文件 libTransform3D.dll 而不是 Transform3D.lib

dll 是没法 link 的。只能 link .dll 对应的导出库 .lib 首先确认代码有没有设置符号导出,有符号导出,才能自动生成dll 对应的 lib 库 然后走 add_deps() 自动关联依赖,会自动 link 对应的 lib

没有符号导出 该怎么办呢? 只有生成的.dll ,libTransform6D.dll 依赖libTransform3D.dll

自己去 msdn 或者 google 上看下 如何导出符号,这个是自身代码和 msvc 的问题,跟 xmake 没啥关系

waruqi commented 3 years ago

https://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll?view=msvc-160

xq114 commented 3 years ago

xmake可以导出全部符号,但这一行为不一定是你想要的:

add_rules("utils.symbols.export_all")
waruqi commented 3 years ago

自己的库,最好自己代码里面手动导出