xmake-io / xmake

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

如何增加系统lib库 #243

Closed Ultraman95 closed 5 years ago

Ultraman95 commented 6 years ago

kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib 类似这些系统的lib库,xmake是自动扫描还是要手动写配置,我的工程里面用到了这些库,我没有手动配置,目前好像有些没有加载进来

waruqi commented 6 years ago

默认xmake是不去加的,尽量提供用户更多的配置空间和灵活度。。有需要,你可以通过add_links自己加上。。

当然xmake也提供了一些内置的规则,自动追加这些库,例如:win.sdk.application 规则,用于写win sdk程序,它会追加win sdk用的一些常用库(也就是你上面说的这些):

target("demo")
    add_rules("win.sdk.application")
    add_files("src/*.c")

还有 win.sdk.mfc.static_app 等等 。你可以到这里看看https://github.com/tboox/xmake/tree/master/xmake/rules/winsdk

你也可以自己扩展定制自己的常用规则

Ultraman95 commented 6 years ago

add_rules("win.sdk.application")依然不可以,好像wsock32.lib这个没有加载

waruqi commented 6 years ago

win.sdk.application 只是加了sdk ui 开发用到的常用库,不可能保证所有用户需要的库,都给内置进去,这个自己用add_links("wsock32")加一下就好,没必要去纠结这些,缺什么就自己加什么呗,这个本身就应该让用户自己去配置的。。

Ultraman95 commented 6 years ago

不是纠结,是没有编译通过。 LIBCMT.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 "int cdecl scrt_common_main_seh(void)" (?__scrt_commonmain seh@@YAHXZ) 中被引用

同时,为什么一般下载的三方库,add_links需要指明路径,而wsock32这种系统库不需要指明路径

Ultraman95 commented 6 years ago

add_rules("mode.debug", "mode.release")

add_defines("WINDOWS") add_defines("MSVC") add_defines("DEBUG") add_defines("DEBUG_LOG")

-- add target target("tinit")

-- set kind
set_kind("binary")

add_rules("win.sdk.application")

-- add .h files
add_includedirs("../../source/platform/")
add_includedirs("../../source/base/")
add_includedirs("../../source/utility/")
add_includedirs("../../source/probelogger/")
add_includedirs("../../source/datastruct/")
add_includedirs("../../source/network/")
add_includedirs("../../source/event/")
add_includedirs("../../source/tcpnetwork/")
add_includedirs("../../source/udpnetwork/")
add_includedirs("../../source/protocol/")
add_includedirs("../../source/channelprotocol/")
add_includedirs("../../source/scpprotocol/")
add_includedirs("../../source/xmpprotocol/")
add_includedirs("../../source/xtpprotocol/")
add_includedirs("../../source/fib/")
add_includedirs("../../source/customDataType/")
add_includedirs("../../source/xtpfield/")
add_includedirs("../../source/multinetwork/")
add_includedirs("../../source/xml/")
add_includedirs("../../source/deployconfig/")
add_includedirs("../../source/version/")
add_includedirs("../../source/tinit/")
add_includedirs("../../source/tinit/define/")
add_includedirs("../../../baserun/include/sqlapi/")

-- add .cpp files
add_files("../../source/platform/*.cpp")
add_files("../../source/base/*.cpp")
add_files("../../source/utility/*.cpp")
add_files("../../source/probelogger/*.cpp")
add_files("../../source/datastruct/*.cpp")
add_files("../../source/network/*.cpp")
add_files("../../source/event/*.cpp")
add_files("../../source/tcpnetwork/*.cpp")
add_files("../../source/udpnetwork/*.cpp")
add_files("../../source/protocol/*.cpp")
add_files("../../source/channelprotocol/*.cpp")
add_files("../../source/scpprotocol/*.cpp")
add_files("../../source/xmpprotocol/*.cpp")
add_files("../../source/xtpprotocol/*.cpp")
add_files("../../source/fib/*.cpp")
add_files("../../source/xtpfield/*.cpp")
add_files("../../source/multinetwork/*.cpp")
add_files("../../source/xml/*.cpp")
add_files("../../source/deployconfig/*.cpp")
add_files("../../source/version/*.cpp")
add_files("../../source/tinit/*.cpp")
add_files("../../source/tinit/define/*.cpp")
add_files("../../../baserun/include/sqlapi/*.cpp")

add_links("../../../baserun/lib_windows/dll32/sqlapi")
add_links("wsock32")

这个是我的xmake.lua 我的是main()开头,不是winMain()

Ultraman95 commented 6 years ago

这个问题已经从你以前的issue 10中找到答案了

waruqi commented 6 years ago

嗯 应用上win.sdk.application这个规则,说明我们现在是在写基于win sdk的窗口程序 所以main入口需要改成winmain

同时,为什么一般下载的三方库,add_links需要指明路径,而wsock32这种系统库不需要指明路径

这个是因为vc的编译环境默认带了系统库的lib搜索目录了,所以直接加links就行了,而第三方库 需要自己额外设置link dirs,通过add_linkdirs