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

合并多个静态库object不完整 #1873

Closed
ldseraph opened this issue Dec 1, 2021 · 3 comments
Closed

合并多个静态库object不完整 #1873

ldseraph opened this issue Dec 1, 2021 · 3 comments
Labels

Comments

@ldseraph
Copy link

ldseraph commented Dec 1, 2021

合并多个静态库object不完整

描述问题

  1. 如果只合并多个静态库,没有.c文件,object会直接报错。
    错误打印
target("rtthread")
    set_kind("static")
    -- add_files("rtthread/*.c")
    add_files("rtthread/*.a")
    after_build(function (target)
        print(target:objectfiles())
    end)

error: unknown source file: rtthread/libDrivers_gcc.a
2.如果合并多个静态库并且添加.c文件,第一次build 正确,第二次object就会不完整。

target("rtthread")
    set_kind("static")
    add_files("rtthread/*.c")
    add_files("rtthread/*.a")
    after_build(function (target)
        print(target:objectfiles())
    end)

第一次
{
"build/.objs/rtthread/cross/none/release/rtthread/aaa.c.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDrivers_gcc.a.o.dir/board.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDrivers_gcc.a.o.dir/drv_usart.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/mempool.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/ipc.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/idle.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/object.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/irq.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/mem.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/scheduler.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/components.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/timer.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/thread.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/device.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/kservice.o",
"build/.objs/rtthread/cross/none/release/rtthread/libKernel_gcc.a.o.dir/clock.o",
"build/.objs/rtthread/cross/none/release/rtthread/libCPU_gcc.a.o.dir/cpuport.o",
"build/.objs/rtthread/cross/none/release/rtthread/libCPU_gcc.a.o.dir/context_gcc.o",
"build/.objs/rtthread/cross/none/release/rtthread/libCPU_gcc.a.o.dir/backtrace.o",
"build/.objs/rtthread/cross/none/release/rtthread/libCPU_gcc.a.o.dir/showmem.o",
"build/.objs/rtthread/cross/none/release/rtthread/libCPU_gcc.a.o.dir/div0.o",
"build/.objs/rtthread/cross/none/release/rtthread/libc_gcc.a.o.dir/syscalls.o",
"build/.objs/rtthread/cross/none/release/rtthread/libc_gcc.a.o.dir/time.o",
"build/.objs/rtthread/cross/none/release/rtthread/libFilesystem_gcc.a.o.dir/dfs_posix.o",
"build/.objs/rtthread/cross/none/release/rtthread/libFilesystem_gcc.a.o.dir/dfs_fs.o",
"build/.objs/rtthread/cross/none/release/rtthread/libFilesystem_gcc.a.o.dir/dfs_file.o",
"build/.objs/rtthread/cross/none/release/rtthread/libFilesystem_gcc.a.o.dir/dfs.o",
"build/.objs/rtthread/cross/none/release/rtthread/libFinsh_gcc.a.o.dir/msh.o",
"build/.objs/rtthread/cross/none/release/rtthread/libFinsh_gcc.a.o.dir/shell.o",
"build/.objs/rtthread/cross/none/release/rtthread/libFinsh_gcc.a.o.dir/cmd.o",
"build/.objs/rtthread/cross/none/release/rtthread/libFinsh_gcc.a.o.dir/msh_file.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDeviceDrivers_gcc.a.o.dir/ringblk_buf.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDeviceDrivers_gcc.a.o.dir/dataqueue.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDeviceDrivers_gcc.a.o.dir/waitqueue.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDeviceDrivers_gcc.a.o.dir/pipe.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDeviceDrivers_gcc.a.o.dir/completion.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDeviceDrivers_gcc.a.o.dir/workqueue.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDeviceDrivers_gcc.a.o.dir/ringbuffer.o",
"build/.objs/rtthread/cross/none/release/rtthread/libDeviceDrivers_gcc.a.o.dir/serial.o"
}
第二次

{ 
  "build/.objs/rtthread/cross/none/release/rtthread/aaa.c.o",
  "build/.objs/rtthread/cross/none/release/rtthread/libDrivers_gcc.a.o.dir/board.o",
  "build/.objs/rtthread/cross/none/release/rtthread/libDrivers_gcc.a.o.dir/drv_usart.o" 
}

期待的结果

build正确

错误信息

如上

相关环境

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

  • xmake版本:xmake v2.5.9+202110311353,
  • xmake运行平台:Linux USER-20210804KI 5.10.16.3-microsoft-standard-WSL2 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
  • xmake目标平台:cross

其他信息

测试工程 xmake-test
有完整xmake.lua

@ldseraph ldseraph added the bug label Dec 1, 2021
@waruqi
Copy link
Member

waruqi commented Dec 1, 2021

合并静态库,建议走 merge_staticlib 在 after_link 里面做,这个目前更可靠,也不会有.o 冲突问题。

#1638

@waruqi
Copy link
Member

waruqi commented Dec 1, 2021

如果只合并多个静态库,没有.c文件,object会直接报错。

目前只有 c++ rules 才带有merge功能,你一个 c 文件都没有,要么加个空文件,要么手动设置 add_rules("c++") 或者直接 add_rules("utils.merge.archive")

@ldseraph
Copy link
Author

ldseraph commented Dec 1, 2021

多谢。问题已经解决。

@ldseraph ldseraph closed this as completed Dec 1, 2021
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

2 participants