我的(主要)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符号)
我已经尝试过的事情
为 add_library 添加SOURCES的顺序重要吗?
我们如何确保链接顺序正确,以满足相关性要求?
任何建议都会有很大帮助,我在这个问题上停留了太长时间了!