2013-07-22 2 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 (thats the goal), я получаю сообщение об ошибке: могут загружаться только ET_DYN и ET_EXEC. Я думаю, мой файл mylib.o не является общим объектом, который может быть загружен динамически другими процессами. Но как мне это достичь? – GeorgieF

+0

@GeorgieF действительно зависит от вашей платформы. Вы должны посмотреть, как создавать общие библиотеки на этой платформе, но также и как сделать, если все работает с ruby ​​ffi (с которым у меня есть нулевой опыт). – juanchopanza

+0

Благодарим вас за ввод. К сожалению, у меня есть куча готового кода и вам нужно извлечь некоторые из его функций в lib. Файл Makefile уже существует, и я попытался создать файлы .a и .so через 'ar rvs foobar.a foobar.o' и' ar crf foobar.so foobar.o'. Результаты не загружаются с помощью ffi. Поскольку у меня нет GUI IDE, где я мог бы создать что-то новое из шаблона, я застрял здесь. Thx в любом случае. – GeorgieF

Смежные вопросы