当前位置: 首页 > 知识库问答 >
问题:

CMake无法检测不同静态库中的符号冲突

魏煜祺
2023-03-14
├── CMakeLists.txt
├── lib1
│   ├── CMakeLists.txt
│   ├── lib1.cpp
│   └── lib1.h
├── lib2
│   ├── CMakeLists.txt
│   ├── lib2.cpp
│   └── lib2.h
└── main.cpp
add_library(lib1 "")
target_include_directories(lib1
  PUBLIC
      ${CMAKE_CURRENT_LIST_DIR}
)
target_sources(lib1
    PRIVATE
        lib1.cpp
        lib1.h
)

在lib1.cpp中,有一个函数“void say()”:

#include <stdio.h>

void say()
{
    printf("hello from lib1\n");
}

lib2/cmakelists.txt:

add_library(lib2 "")
target_include_directories(lib2
  PUBLIC
      ${CMAKE_CURRENT_LIST_DIR}
)
target_sources(lib2
    PRIVATE
        lib2.cpp
        lib2.h
)

在lib2/lib2.cpp中,有一个相同签名的函数:

#include <stdio.h>
void say()
{
    printf("hello from lib2\n");
}
cmake_minimum_required(VERSION 3.16)
project(shell LANGUAGES CXX)
add_subdirectory(lib1)
add_subdirectory(lib2)
add_executable(test2
  main.cpp
)
target_link_libraries(test2
  PRIVATE
    lib1
    lib2
)
void say();
int main()
{
    say();
    return 0;
} 
hello from lib1

如何使链接器在静态库中出现符号冲突时提示错误?

谢了!

共有1个答案

申宜
2023-03-14

如何使链接器在静态库中出现符号冲突时提示错误?

对于gcc,使用--solute-archive选项将每个对象文件都包含在存档中,而不是在存档中搜索所需的符号。

由于没有我所知道的cmake支持,我发现通常在链接可执行文件时完成:

target_link_libraries(test2 PRIVATE
    -Wl,--whole-archive
    lib1
    lib2
    -Wl,--no-whole-archive
)
 类似资料:
  • 出于安全考虑,我希望静态链接所有库,包括包含JNI\u OnLoad函数的本机库。我已经读到可以静态链接JNI库(http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#library_version)但我用Android Studio做不到。有可能吗? 这是我目前拥有的。 在Java代码中: 在

  • 我正在构建一个github代码的静态库https://github.com/jasenhuang/aswbxml-c。我能够成功地构建库,但当我尝试添加项目时,却出现了一个错误。下面是错误日志。 我曾尝试为Xcode项目更改C++编译器类型,但没有成功。

  • 我有一个类,其中有一些静态方法和一些非静态方法,所以当我试图从静态方法访问非静态方法时,我会遇到一个著名的错误。每当我搜索这个论坛,我得到的解决方案,当有两个类,从一个你试图达到另一个。我的问题是,如果它们在同一个类中,如何从静态方法调用非静态方法? 我试着用 但是我的方法包含发送Intent和finish(),所以如果我创建的对象不是finish,就不起作用。

  • 问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。

  • 问题内容: 我在C ++编写一个程序来找到所有的解决方案一b = c ^,其中一个,b和c ^一起使用所有的数字0-9只出现一次。该程序循环了a和b的值,并且每次在a,b和a b上运行一个数字计数例程,以检查是否满足数字条件。 但是,当a b超出整数限制时,可能会生成伪解。我最终使用如下代码检查了这一点: 有没有更好的测试溢出方式?我知道有些芯片具有发生溢出时设置的内部标志,但我从未见过通过C或C

  • 本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对