我获得了链接程序的命令:
g++ -o prog_name prog_name.cc -lsicklms-x -pthread
但是,我没有使用命令行,我正在使用eclipse。
我的项目名为“测试”,我只有一个类“main.cpp”,即:
/*
* Test.cpp
*
* Created on: Dec 1, 2011
* Author: igvc
*/
#include <iostream>
#include <sicklms-1.0/SickLMS.hh>
using namespace std;
using namespace SickToolbox;
int main(int argc, char *argv[]) {
/* Specify device path and baud */
string dev_path = "/dev/ttyUSB0";
sick_lms_baud_t lms_baud = SickLMS::SICK_BAUD_38400;
/* Define buffers for return values */
unsigned int measurements[SickLMS::SICK_MAX_NUM_MEASUREMENTS] = {0};
unsigned int num_measurements = 0;
/* Instantiate the object */
SickLMS sick_lms(dev_path);
try {
/* Initialize the device */
sick_lms.Initialize(lms_baud);
/* Grab some measurements */
for(unsigned int i = 0; i < 10; i++) {
sick_lms.GetSickScan(measurements,num_measurements);
cout << "\t" << num_measurements << endl;
}
/* Uninitialize the device */
sick_lms.Uninitialize();
}
catch(...) {
cerr << "error" << endl;
return -1;
}
return 0;
}
我收到了所有这些错误:
undefined reference to `SickToolbox::SickLMS::~SickLMS()`
undefined reference to `SickToolbox::SickLMS::GetSickScan(unsigned int*, unsigned int&, unsigned int*, unsigned int*, unsigned int*, unsigned int*, unsigned int*)'
undefined reference to `SickToolbox::SickLMS::Initialize(SickToolbox::SickLMS::sick_lms_baud_t)'
undefined reference to `SickToolbox::SickLMS::SickLMS(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
undefined reference to `SickToolbox::SickLMS::Uninitialize()'
所以我认为这是一个链接问题。我有上面的命令链接,教程说这是必需的,但我不知道如何在eclipse中设置它。
代码显示为#include sicklms-1.0/SickLMS.hh
,我确实转到了Project&gt;属性&gt; C / C ++ Build&gt;设置&gt; GCC C ++编译器&gt;目录并将目录添加到.h文件中并解决了该问题,但现在我收到了这些错误。我去了GCC C ++ Linker&gt; Libraries&gt;库搜索路径(-L)并添加了sicktoolbox-1.0.1目录,但我不知道在库(-l)部分放什么。
感谢您的帮助,我真的坚持这一点。
答案 0 :(得分:2)
大概你在使用Eclipse CDT?
右键单击您的项目,然后从上下文菜单中选择“属性”。
在Properties对话框中,选择C / C ++ Build-&gt; Settings-&gt; GCC C ++ Linker-&gt; Libraries
在“库”框中,单击+按钮添加新库,键入 sicklms
您的库必须位于链接器的路径中。 / usr / lib和/ usr / local / lib是相当标准的。对于-l,库名必须是libsicklms.a或libsicklms.so,因为链接器会将 lib 添加到库名。
如果使用./configure&amp;&amp;来源安装了sicklms。制造&amp;&amp; make install然后库应该在标准库路径中,即/ usr / lib或/ usr / local / lib,否则你的问题不是你的链接器,而是安装了sicklms的方式。
如果上述任何说明不可行,您需要告诉我
a)Eclipse版本(Galileo,Indigo等)
b)如果您安装了CDT。
c)您的系统上是否安装了病毒(包管理器,从源代码构建等)。
答案 1 :(得分:0)
完全基于您在此处所写的内容,我想想在-l
部分,您需要添加-lpthread -lsicklms-x
。但是,假设Eclipse提供了足够的智能来替换make(1)
这样的工具,这对于重建大型项目非常有用。
尝试在项目目录中创建Makefile
,如下所示:
LDFLAGS=-L/path/to/sicklms-directory -lsicklms-x -lpthread
运行make
然后给出:
$ make main
g++ -L/path/to/sicklms-directory -lsicklms-x -lpthread main.cpp -o main
/usr/bin/ld.bfd.real: cannot find -lsicklms-x
collect2: ld returned 1 exit status
make: *** [main] Error 1
(它失败了,因为我没有你的库。但它确实显示了为尝试构建源而执行的命令行。)
您也可以对编译Java程序进行一些简单的更改。我只能轻松获得超简单的Java源代码,但以下Makefile
让我可以轻松地重新构建它们:
$ cat Makefile
.SUFFIXES: .java .class
.java.class:
javac $<
all: Echo.class Test.class Compress.class
$ make Echo.class Test.class
javac Echo.java
make: `Test.class' is up to date.
$ rm *class
$ make
javac Echo.java
javac Test.java
javac Compress.java
(请注意,缩进行是使用制表符缩进的。它必须是一个制表符。make(1)
在一些非常不方便的方式中是过时的。)