Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

删除有合并库的静态库文件后,重新编译会使库失效并会缺少文件 #1973

Closed
Smartqiu opened this issue Jan 13, 2022 · 25 comments
Labels
Milestone

Comments

@Smartqiu
Copy link

!!! 注:提问题时若使用不能用/没效果/有问题/报错此类模糊表达,但又没有根据下面的模板给出任何相关辅助信息的,将会直接标记为 Invalid。

描述问题

我有一个名为test的项目,我期望将test文件夹中的资源编译为静态库使用。编译的结果放在bulid文件夹中。

image

编译后的文件夹:
image

xmake.lua:

set_project("test")

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

if is_plat("android") then
	add_cxxflags("-std=c++11")
end

target("test")
	-- set kind
	set_kind("static")
	-- add files
	add_files("test/*.cpp")
	-- add lib
	add_files("test/*.lib")

windows32位编译使用的bat
xmake f -p windows -a x86 --vs_runtime=MTd -m debug xmake build

Android32位编译使用的bat
xmake f -p android -a armeabi-v7a -m release --ndk_cxxstl=gnustl_static xmake build

初次编译时生成的库是正常可用的,window编译生成了test.lib、test.pdb,Android编译生成test.a

当我不删除bulid文件夹,仅删除bulid文件夹中的test.lib、test.pdb和test.a,重新执行bat,此时重新生成的静态库无法使用,静态库的大小发生了变化,应该是在合并库时出现问题,并且test.pdb丢失。

而如果删除整个bulid文件夹,重新编译后,生成的静态库是完全正常的。

期待的结果

仅删除文件夹中生成的静态库文件时,重新编译依旧可以正常生成文件。

错误信息

这是我删除库文件后重新编译时的提示:
image
image

相关环境

请提供编译和运行环境信息,下面是一些必须填写的基础信息,便于我们针对性排查问题:

  • xmake版本:2.6.2.0
  • xmake运行平台:Windows10
  • xmake目标平台:Windows10

其他信息

如果我的描述不够清晰,您需要例子请留言

@Smartqiu Smartqiu added the bug label Jan 13, 2022
@waruqi
Copy link
Member

waruqi commented Jan 13, 2022

走 utils.archive.merge_staticlib merge

#1638

@Smartqiu
Copy link
Author

我已经看过了#1638的内容,并且作出了一些列的尝试,但并没有得到想要的结果

这是工程中的xmake.lua如下:
企业微信截图_16421524933043

工程目录下没有build文件夹时,运行xmake-vs2019-32.bat后
image
企业微信截图_16421529122494
image

我使用bat编译后生成了上图的静态库,此时是正常可用的
我仅删除上图中的静态库文件后,再次使用bat编译,变成了下图
image
image
修改xmake第18行添加的顺序
image
image
合成出的lib依旧是有问题的,重新生成的静态库大小都小于正常的库,并且缺少了.pdb文件

@waruqi
Copy link
Member

waruqi commented Jan 14, 2022

既然用了 merge_staticlib,为什么还要 add_files 它们,这不是互相冲突覆写么。

另外,目前仅支持 merge 库,不会 merge pdb

@Smartqiu
Copy link
Author

感谢您快速的回复,我会继续尝试解决问题。

@Smartqiu
Copy link
Author

我尝试将18行注释掉,print(target:objectfiles())输出的值中反而没有了我需要的库,得到的lib依旧错误

@waruqi
Copy link
Member

waruqi commented Jan 14, 2022

我尝试将18行注释掉,print(target:objectfiles())输出的值中反而没有了我需要的库,得到的lib依旧错误

这不是对的么,就是不应该有,走 add_files .lib 才会 hack 下这么搞,最后把所有 obj 打到 target

走 merge_staticlib 接口,你要自己指定输出 lib path ,不会打入当前 target

自己看下参数说明

function main(target, outputfile, libraryfiles)

@OuYangPaste
Copy link

话说,我一直好奇,为什么不改成在 add_files 静态库时默认调用 merge_staticlib 呢

@waruqi
Copy link
Member

waruqi commented Jan 16, 2022

话说,我一直好奇,为什么不改成在 add_files 静态库时默认调用 merge_staticlib 呢

懒得改 没时间

@waruqi
Copy link
Member

waruqi commented Jan 18, 2022

改了下,再试试

@waruqi waruqi added this to the v2.6.3 milestone Jan 18, 2022
@Smartqiu
Copy link
Author

非常感谢您的解释

@waruqi
Copy link
Member

waruqi commented Jan 18, 2022

确认下,刚的更新 可以了没有

@Smartqiu
Copy link
Author

工程中使用的还是旧版本的,我会尽快使用新版本的进行测试,同时我还发现了一些其他问题,确认后我将一并告诉您

@waruqi
Copy link
Member

waruqi commented Jan 18, 2022

用 dev 版本

@Smartqiu
Copy link
Author

好的

@Smartqiu
Copy link
Author

我已经验证了,现在的功能和我期望的一样,非常感谢!

同时还有一个新的问题,虽然现在我可以直接使用add_files(),但merge_staticlib()函数可能会有问题。
image
这一段代码中使用Windows编译可以正常进行,librecast.lib和libdetour.lib可以正常合成到target库中。使用安卓编译时,我无法正常使用下面这种逻辑,即安卓编译时我使用merge_staticlib函数无法将两个库合并到targetfile后再输出到targetfile。

@waruqi
Copy link
Member

waruqi commented Jan 19, 2022

/temp.a /target.a 你确定这种 / 根路径 你有写权限?xmake 默认 root 下不让用的

@Smartqiu
Copy link
Author

这个例子我是简化后的,这些.a实际位置在D盘中我的工作目录下

@waruqi
Copy link
Member

waruqi commented Jan 19, 2022

win 我没环境,自己调下下面脚本,比如加上 android 什么的试试

if target:is_plat("macosx", "iphoneos", "watchos", "appletvos") then

@Smartqiu
Copy link
Author

好的,我会继续尝试

@waruqi
Copy link
Member

waruqi commented Jan 22, 2022

可以了么

@waruqi waruqi modified the milestones: v2.6.3, v2.6.4 Jan 22, 2022
@Smartqiu
Copy link
Author

不好意思让您久等了,我尝试了加上 android 选项,但这样依旧无法运行。目前我的项目编译使用 add_files,这里的问题暂时搁置了 。

@waruqi
Copy link
Member

waruqi commented Jan 27, 2022

不好意思让您久等了,我尝试了加上 android 选项,但这样依旧无法运行。目前我的项目编译使用 add_files,这里的问题暂时搁置了 。

我改进了下,你再试试,dev版本

@Smartqiu
Copy link
Author

以下代码,分别添加多个库可以了,

lib = {target:targetfile(), "./libdetour.a",  "./librecast.a"}
merge_staticlib(target, target:targetfile(), lib)

不过如果我想添加目录下全部的.a还是会提示找不到库

lib = {target:targetfile(), "./*.a"}
merge_staticlib(target, target:targetfile(), lib)

@waruqi
Copy link
Member

waruqi commented Jan 30, 2022

这不是shell,自己遍历追加 lib 并确保路径有效. os.files(path.join(os.projectdir(), "xxx", "*.a"))

@waruqi waruqi closed this as completed Jan 30, 2022
@Smartqiu
Copy link
Author

非常感谢,理解了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants