У меня есть следующее в заголовочном файле.
namespace silc{
class pattern_token_map
{
/* Contents */
};
pattern_token_map* load_from_file(const char*);
}
В файле CPP (это имеет надлежащий, включает),
pattern_token_map* load_from_file(const char* filename)
{
// Implementation goes here
}
В другом файле CPP. Это имеет, все надлежащие включают.
void some_method()
{
const char* filename = "sample.xml";
pattern_token_map* map = load_from_file( filename ); // Linker complains about this.
}
Я получаю ошибку компоновщика, говоря что неопределенная ссылка на load_from_file
. Я не могу видеть то, что идет не так, как надо здесь.
Любая справка ценилась бы.
Компилятор: G ++ ОС: Ubuntu 9.10
Править
Вот используемая команда компоновщика.
g++ -L/home/nkn/silc-project/third_party/UnitTest++ -o tests.out src/phonetic_kit/pattern_token_map.o tests/pattern_token_map_tests.o tests/main.o -lUnitTest++
Ошибка от pattern_token_map_tests.o
и функция доступна в pattern_token_map.o
. Таким образом, я предполагаю, что порядок соединения не делает проблему. (Я удалил некоторые файлы из команды для упрощения его),
Когда вы реализуете его, нужно убедиться, что вы реализуете правильную функцию:
namespace silc {
pattern_token_map* load_from_file(const char* filename) {
// Implementation goes here
}
}
Если бы вы вместо этого сделали это:
using namespace silc; // to get pattern_token_map
pattern_token_map* load_from_file(const char* filename) {
// Implementation goes here
}
Тогда бы вы определяли новую функцию, а не silc::load_from_file.
Избегайте использования директив ("использование пространства имен ...;") за пределами области действия функции, в качестве общего руководства:
using namespace silc; // outside function scope: avoid
silc::pattern_token_map* // qualify return type
random_function(silc::pattern_token_map* p) { // and parameters
using namespace silc; // inside function scope: fine
pattern_token_map* p2 = 0; // don't have to qualify inside the function
// if you want to use the using directive
silc::pattern_token_map* p3 = 0; // but you can always do this
return 0;
}
Я начинающий креветка, так что это может быть не лучшим решением, но оно должно работать.
Можно получить высоту таблицы, если учитывать размер шрифта и вертикальную набивку, а также количество записей в @ data
и получить текущую позицию курсора, вызвав метод Prawn:: Document.cursor
.
Имея эти два номера, вы должны иметь возможность проверить, вписывается ли таблица на этой странице или нет. Если нет, просто запустите новую (путем вызова метода Prawn:: Document.start _ new _ page
).
В противном случае таблица будет разорвана автоматически и продолжится на следующей странице.
-121--4746514-Я бы рекомендовал использовать инструмент статического анализа, такой как
, который часто может обнаруживать взаимоблокировки во время компиляции
-121--3339003-Выполняется ли связывание в файле объекта, созданном при компиляции первого файла cpp? Подобные ошибки компоновщика возникают, когда один объект ссылается на символ, который не включен в связанные объекты.
Изменить: Я все еще достаточно уверен, что это проблема. В первом файле имеется ли переопределение символа препроцессора load_from_file?