2013-07-22 170 views
0

我是C++ noob,现在摆弄了几个小时的下列问题。希望有人能够启发我。如何将字符串类型参数传递给C++方法

我有内容,像这样一个CPP文件:

TEST.CPP文件内容

#include <iostream> 
#include <exception> 
#include <stdlib.h> 
#include <string.h> 
using std::cin; using std::endl; 
using std::string; 


string foobar(string bar) { 
    return "foo" + bar; 
} 

int main(int argc, char* argv[]) 
{ 
    string bar = "bar"; 
    System::convCout << "Foobar: " << foobar(bar) << endl; 
} 

这一个编译和运行良好。现在,我想放在foobar的到外部库:

mylib.h文件内容

string foobar(string bar); 

mylib.cpp文件内容

#include <string.h> 
using std::cin; using std::endl; 
using std::string; 

string foobar(string bar) { 
    return "foo" + bar; 
} 

TEST.CPP文件内容

#include <iostream> 
#include <exception> 
#include <stdlib.h> 
#include "mylib.h" 

int main(int argc, char* argv[]) 
{ 
    string bar = "bar"; 
    System::convCout << "Foobar: " << foobar(bar) << endl; 
} 

我调整了我的Makefile,以便test.cpp编译并链接mylib,但我总是遇到错误:

test.cpp::8 undefined reference to `foobar(std::string) 

我该如何处理字符串参数?我的尝试似乎在这里完全错误。

问候 菲利克斯

+1

显示完整的链接声明。 – trojanfoe

+0

你是如何与外部图书馆联系的?你忘了添加'-lmylib'来链接参数吗? –

+1

你的意思是包括''而不是''? –

回答

1

C++标准库类型std::string是在头string。要使用它,您必须包含<string>,而不是<string.h>。你mylib.h应该是这个样子

#ifndef MYLIB_H 
#define MYLIB_H 

#include <string> 

std::string foobar(std::string bar); 

#endif 

和你mylib.cpp应该包括它:

#include "mylib.h" 

std::string foobar(std::string bar) { 
    return "foo" + bar; 
} 

注意,这可能是不必要的按值传递bar。看看你的代码,const参考可能会。

+0

谢谢!了解。这效果很好,并在我的调试文件夹中生成一个mylib.o。当我尝试通过ruby ffi(即目标)加载该目标文件时,出现错误:只能加载ET_DYN和ET_EXEC。我猜,我的mylib.o文件不是可以由其他进程动态加载的共享对象。但我如何实现这一目标? – GeorgieF

+0

@GeorgieF真的取决于你的平台。您应该查看如何在该平台上构建共享库,以及如何使用ruby ffi(我没有经验)使用它。 – juanchopanza

+0

感谢您的意见。不幸的是,我有一堆预装的代码,必须将其一些功能提取到一个库中。 Makefile已经存在,我试图通过'arrvs foobar.a foobar.o'和'ar crf foobar.so foobar.o'创建一个.a和.so文件。结果不能由ffi加载。由于我没有GUI IDE,我可以从模板中创建新的东西,所以我在这里坚持使用它。无论如何。 – GeorgieF

相关问题