在CMake中链接静态库时未定义的引用

时间:2020-11-04 16:01:17

标签: c++ gcc cmake linker

我的(主要)C ++项目由以下结构组成,创建了一个带有许多静态库的可执行目标。子目录中存在一个这样的库,其中包括一个C ++源文件,该文件依赖于同一子目录中的另一个c ++源文件。

我将CMake与ARM-GNU配合使用,并将MinGW用作生成器。

两个c ++源文件如下:

A.cpp

db.getCollection('collection').aggregate([
    { '$facet': {
        'counts': [
            { '$match': { 'id': { '$in': ['111', '222', '333'] } } }, 
            { '$count': "numberOfMatches" }
        ],
        'docs': [
            { '$match': { 'id': { '$in': ['111', '222', '333'] } } }, 
        ]  
    } },
    {  '$project': {
        'result': {
            '$filter': {
                'input': '$docs',
                'cond': {
                    '$gt': [
                        { '$size': '$$this.tags' },
                        { '$arrayElemAt': ['$counts.numberOfMatches', 0] }
                    ]
                }
            }
        } 
    } }
])

B.cpp

#include "base.h"
int serial :: available(void)
{
return usb.available();
}
Serial_ Serial(USBDevice);

公共头文件: base.h

#include "base.h"
int USBDeviceClass :: available()
{
return something;
}
USBDeviceClass USBDevice;

我的项目结构:

class Serial_
{
public:
int available();
} 
extern Serial_ Serial;

class USBDeviceClass
{
public:
int available();
}
extern USBDeviceClass USBDevice;
USBDeviceClass &usb;

CMakeLists.txt

Project(Foo)

  CMakeLists.txt

  application.cpp

  application.hpp

  (subdirectory1)
          CMakeLists.txt

          include

                   A.hpp

                    B.hpp

                   base.h

            src

                   A.cpp

                   B.cpp

子目录1 / CMakeLists.txt

Project(Foo)

set(CMAKE_C_COMPILER "C://Program Files (x86)/Atmel/Studio/7.0/toolchain/arm/arm-gnu-toolchain/bin/arm-none-eabi-gcc.exe")
set(CMAKE_CXX_COMPILER "C://Program Files (x86)/Atmel/Studio/7.0/toolchain/arm/arm-gnu-toolchain/bin/arm-none-eabi-g++.exe")

set(CMAKE_C_FLAGS "-x c -mthumb  -D__SAMD21G18A__ -DARM_MATH_CM0 -DF_CPU=48000000L -DARDUINO=10808 -DARDUINO_SAMD_ZERO -DARDUINO_ARCH_SAMD -DUSB_VID=0x239A -DUSB_PID=0x800B  -march=armv6-m -c -std=gnu99 -ffunction-sections -mlong-calls -g3 -Wall")
set(CMAKE_CXX_FLAGS "-mthumb -D__SAMD21G18A__ -DARM_MATH_CM0 -DF_CPU=48000000L -DARDUINO=10808 -DARDUINO_SAMD_ZERO -DARDUINO_ARCH_SAMD -DUSB_VID=0x239A  -DUSB_PID=0x800B   -ffunction-sections -fno-rtti -fno-exceptions -mlong-calls -march=armv6-m")
set(CMAKE_EXE_LINKER_FLAGS "-Wl,-lm -Wl,--gc-sections -mcpu=cortex-m0plus -specs=nano.specs -specs=nosys.specs -Wl,-T\"../flash_without_bootloader.ld\"")   

include_direcctories(subdirectory1/include)
add_executable(Foo.elf application.cpp application.hpp)
add_subdirectory(subdirectory1)
target_link_libraries(Foo.elf PUBLIC Bar)

正在尝试构建的错误

set(SOURCES 
    A.cpp
    B.cpp
)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_library(Bar STATIC ${SOURCES})

我的理解是,问题在于链接器无法找到未定义符号的定义。 (我尝试了bindump,发现 A.cpp.obj 的UND符号)

我已经尝试过的事情

  1. 外部“ C”
  2. 解决循环依赖(没有)
  3. 试图构建为共享库(导致“ **输出中的非代表部分”)

add_library 添加SOURCES的顺序重要吗?

我们如何确保链接顺序正确,以满足相关性要求?

任何建议都会有很大帮助,我在这个问题上停留了太长时间了!

0 个答案:

没有答案