我有一个关于在Windows中正确链接库libsumocpp和libtracicpp的问题。
我试图使用C++中的libsumo连接到相扑服务器,并有以下代码:
#include <iostream>
#include <libsumo/libtraci.h>
using namespace libtraci;
int main(int argc, char* argv[]) {
Simulation::init();
//Simulation::start({"sumo", "-c", "Network_02.sumocfg"});
Simulation::setOrder(2);
//Simulation::init();
//Simulation::setOrder(2);
for (int i=0; i<50; i++)
{
Simulation::step();
}
Simulation::close();
return 0;
}
上面的代码基于以下C++代码片段((这个github哨所),它试图连接到sumo服务器):
I'm trying to connect to the Sumo simulation from multiple traci clients using libtraci.
This is how I'm starting the simulation:
sumo --remote-port 4001 --num-clients 2 -c config_file.sumocfg
After starting the simulation I'm trying to connect from two traci client using the
code below:
#include <libsumo/libtraci.h>
using namespace libtraci;
int main () {
Simulation::init(4001,21,"localhost");
Simulation::setOrder(3);
for (int i = 0; i < 500000; i++) {
Simulation::step();
}
Simulation::close();
return 0;
}
如前所述,我的代码就是上面的代码。在构建、编译和链接为“libsumo/Simulation”下列出的类“模拟”函数时,我会遇到以下错误。h似乎没有正确链接:
c:/mingw64/bin/../ld.exe: src\Test.o:C:\Users\Lukas\eclipse-ws\Test\Debug/../src/Test.cpp:28:
undefined reference to `libtraci::Simulation::init(int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, _iobuf*)'
c:/mingw64/bin/../bin/ld.exe: src\Test.o: in function `main':
C:\Users\Lukas\eclipse-ws\Test\Debug/../src/Test.cpp:30: undefined reference to `libtraci::Simulation::setOrder(int)'
c:/mingw64/bin/../ld.exe: C:\...\Test.cpp:36: undefined reference to `libtraci::Simulation::step(double)'
c:/mingw64/bin/../ C:.../src/Test.cpp:38: undefined reference to `libtraci::Simulation::close(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2.exe: error: ld returned 1 exit status
我想这是一个链接错误。我在Properties -l C/C++ Build -> Settings -> MinGW C++链接库中提供了指向库“libsudempp.lib/dll”和"libtracicpp.lib/dll“的路径(-L”C:\User\Lukas\eclipse\SUMO\bin“)。但是,它不起作用。有人知道我的设置有什么问题吗?
向你问好,卢卡斯
发布于 2022-05-18 19:03:48
gcc/binutils使用扩展.a
(甚至是共享库的.dll.a
)代替.lib
(由MSVC使用)作为库导入文件。
因此,要链接,您应该将lib<name>.a
(静态)或lib<name>.dll.a
(共享)文件放在指向-L
的文件夹中,然后使用-l<name>
与库进行链接。
gcc (不确定ld)足够聪明,可以知道.dll
本身是一个共享库,因此您甚至可以指定.dll
文件的路径,并且它会知道您想要链接到该共享库。
发布于 2022-05-19 03:11:47
undefined reference to libtraci::Simulation::init(int, int, std::__cxx11::basic_string<...
此错误表明您正在使用-std=c++11
标志编译代码。
但是libtraci
可能不是用这个标志构建的,如果不是,那么您就会得到所得到的错误。
运行nm -C libtracicpp.lib | grep 'libtraci::Simulation::init'
并查看是否有任何内容出现,以及被蒙蔽的符号中是否包含::__cxx11::
。
如果名称中没有__cxx11
,则需要使用-std=c++11
重新构建libtracicpp
,或者在没有标记的情况下构建代码(您的示例似乎没有使用任何C++11
特性)。
https://stackoverflow.com/questions/72288974
复制相似问题