Premake5链接DLL项目到主项目时触发LNK1104错误求助
我之前也踩过一模一样的坑,Premake5处理DLL依赖的时候很容易出这个问题——你看到的LNK1104找不到.lib的错误,本质是编译器需要DLL对应的导入库,但你的配置要么没生成这个库,要么没让主项目定位到它。
一步步拆解修复:
第一步:确认DLL项目的kind设置正确
你的LibProject必须明确设置为kind "SharedLib",这是核心!如果之前写成了kind "StaticLib",生成的是静态库的.lib,和DLL需要的导入库完全不是一回事。修改后的项目配置大概是这样:
project "LibProject" kind "SharedLib" -- 必须是SharedLib,才会生成DLL+对应的导入.lib language "C++" targetdir "bin/%{cfg.buildcfg}" -- 统一输出目录,避免路径混乱 objdir "obj/%{cfg.buildcfg}" files { "src/lib/**.h", "src/lib/**.cpp" } defines { "LIBPROJECT_EXPORTS" } -- 这个宏用来控制符号导出,后面会详细说
第二步:把两个项目放到同一个工作区
Premake需要通过工作区管理项目依赖顺序,确保编译主项目时,LibProject的导入库已经生成。把你的配置用workspace包裹起来:
workspace "MyAppWorkspace" configurations { "Debug", "Release" } platforms { "x64" } -- 保持平台一致,避免32/64位不兼容导致的链接问题 -- 这里放LibProject的配置 -- 接着放MainProject的配置
第三步:修正主项目的链接配置
你写的links { "LibProject" }本身没问题,但得确保主项目能找到导入库的位置,以及LibProject的头文件。修改主项目配置:
project "MainProject" kind "ConsoleApp" -- 或者你需要的其他项目类型,比如WindowedApp language "C++" targetdir "bin/%{cfg.buildcfg}" -- 和LibProject用同一个输出目录,省得额外配置libdirs objdir "obj/%{cfg.buildcfg}" files { "src/main/**.h", "src/main/**.cpp" } links { "LibProject" } -- 链接DLL的导入库 includedirs { "src/lib" } -- 让主项目能找到LibProject的头文件 -- 如果输出目录不一样,就加上这行:libdirs { "bin/%{cfg.buildcfg}" }
第四步:确保DLL符号正确导出
这一步很容易忽略——如果你的DLL里的函数没有被标记为导出,那导入.lib里不会有对应的符号,就算找到.lib也会链接失败。在LibProject的公共头文件里加一个导出宏:
// libproject.h #ifdef LIBPROJECT_EXPORTS #define LIBPROJECT_API __declspec(dllexport) #else #define LIBPROJECT_API __declspec(dllimport) #endif // 用这个宏标记你要导出的函数/类 LIBPROJECT_API void MyLibFunction();
当编译LibProject时,因为我们设置了defines { "LIBPROJECT_EXPORTS" },LIBPROJECT_API会变成__declspec(dllexport),把函数导出到DLL;主项目编译时没有这个宏,会自动变成__declspec(dllimport),告诉编译器这个函数来自外部DLL。
最后检查VS的依赖顺序
打开生成的VS解决方案,右键点击工作区 -> 项目依赖,确认MainProject的依赖列表里有LibProject。这样VS会先编译LibProject生成导入库,再编译主项目,避免编译顺序导致的文件找不到问题。
按照这几步改完,你的LNK1104错误应该就能解决了。
内容的提问来源于stack exchange,提问作者Toby

