C++ C++;:修改了一个函数,尝试重新编译,得到了该函数的未定义引用
我在一个C++ C++;:修改了一个函数,尝试重新编译,得到了该函数的未定义引用,c++,makefile,C++,Makefile,我在一个.cpp文件中修改了函数体foo,该文件是大型软件的一部分(“大型”使得许多头文件和实现文件从不同的目录中相互调用)。该函数仍然使用相同的参数并返回相同的内容,因此在头文件中没有要修改的内容 我在某个地方看到C++的一个优点是它足够聪明,只需要重新编译需要的东西。 所以我(天真地?)做了所有的,但后来我从调用该函数的源文件中得到了错误;这些错误都表示未定义对“foo”的引用 从上面的信息来看,我是否明显做错了什么 好的,你要的是代码,在这里: bool ReadImageToDatum
.cpp
文件中修改了函数体foo
,该文件是大型软件的一部分(“大型”使得许多头文件和实现文件从不同的目录中相互调用)。该函数仍然使用相同的参数并返回相同的内容,因此在头文件中没有要修改的内容
我在某个地方看到C++的一个优点是它足够聪明,只需要重新编译需要的东西。
所以我(天真地?)做了所有的,但后来我从调用该函数的源文件中得到了错误;这些错误都表示未定义对“foo”的引用
从上面的信息来看,我是否明显做错了什么
好的,你要的是代码,在这里:
bool ReadImageToDatum(const string& filename, const int label,
const int height, const int width, Datum* datum) {
cv::Mat cv_img;
if (height > 0 && width > 0) {
cv::Mat cv_img_origin = cv::imread(filename, CV_LOAD_IMAGE_COLOR);
cv::resize(cv_img_origin, cv_img, cv::Size(height, width));
} else {
cv_img = cv::imread(filename, CV_LOAD_IMAGE_COLOR);
}
if (!cv_img.data) {
LOG(ERROR) << "Could not open or find file " << filename;
return false;
}
datum->set_channels(3);
datum->set_height(cv_img.rows);
datum->set_width(cv_img.cols);
datum->set_label(label);
datum->clear_data();
datum->clear_float_data();
string* datum_string = datum->mutable_data();
for (int c = 0; c < 3; ++c) {
for (int h = 0; h < cv_img.rows; ++h) {
for (int w = 0; w < cv_img.cols; ++w) {
datum_string->push_back(
static_cast<char>(cv_img.at<cv::Vec3b>(h, w)[c]));
}
}
}
return true;
}
bool ReadImageToDatum(常量字符串和文件名,常量int标签,
常数高度、常数宽度、基准*基准){
cv::Mat cv_img;
如果(高度>0和宽度>0){
cv::Mat cv\u img\u origin=cv::imread(文件名、cv\u加载\u图像\u颜色);
cv::resize(cv_img_原点、cv_img、cv::Size(高度、宽度));
}否则{
cv\u img=cv::imread(文件名、cv\u加载\u图像\u颜色);
}
如果(!cv_img.data){
日志(错误)设置高度(cv img.行);
基准->设置宽度(cv\U img.cols);
基准->设置标签(标签);
基准->清除数据();
基准->清除浮动数据();
字符串*datum_string=datum->mutable_data();
对于(int c=0;c<3;++c){
对于(int h=0;h推回(
静态铸造(在(h,w)[c]处的等压铸造);
}
}
}
返回true;
}
下面是:
#include <unistd.h>
bool ReadImageToDatum(string& filename, const int label,
const int height, const int width, Datum* datum) {
cv::Mat cv_img;
/* dalyac addition to read/follow symlink if symlink*/
char buf[200];
if (readlink(filename.c_str(), buf, 200) > 0) {
filename = std::string(buf);
}
if (height > 0 && width > 0) {
cv::Mat cv_img_origin = cv::imread(filename, CV_LOAD_IMAGE_COLOR);
cv::resize(cv_img_origin, cv_img, cv::Size(height, width));
} else {
cv_img = cv::imread(filename, CV_LOAD_IMAGE_COLOR);
}
if (!cv_img.data) {
LOG(ERROR) << "Could not open or find file " << filename;
return false;
}
datum->set_channels(3);
datum->set_height(cv_img.rows);
datum->set_width(cv_img.cols);
datum->set_label(label);
datum->clear_data();
datum->clear_float_data();
string* datum_string = datum->mutable_data();
for (int c = 0; c < 3; ++c) {
for (int h = 0; h < cv_img.rows; ++h) {
for (int w = 0; w < cv_img.cols; ++w) {
datum_string->push_back(
static_cast<char>(cv_img.at<cv::Vec3b>(h, w)[c]));
}
}
}
return true;
}
#包括
bool ReadImageToDatum(字符串和文件名,常量int标签,
常数高度、常数宽度、基准*基准){
cv::Mat cv_img;
/*dalyac添加到读取/跟踪symlink(如果是symlink)*/
char-buf[200];
if(readlink(filename.c_str(),buf,200)>0){
filename=std::string(buf);
}
如果(高度>0和宽度>0){
cv::Mat cv\u img\u origin=cv::imread(文件名、cv\u加载\u图像\u颜色);
cv::resize(cv_img_原点、cv_img、cv::Size(高度、宽度));
}否则{
cv\u img=cv::imread(文件名、cv\u加载\u图像\u颜色);
}
如果(!cv_img.data){
日志(错误)设置高度(cv img.行);
基准->设置宽度(cv\U img.cols);
基准->设置标签(标签);
基准->清除数据();
基准->清除浮动数据();
字符串*datum_string=datum->mutable_data();
对于(int c=0;c<3;++c){
对于(int h=0;h推回(
静态铸造(在(h,w)[c]处的等压铸造);
}
}
}
返回true;
}
我把它贴在了粘贴箱上,因为它有400行长
谢谢你的帮助!以下是区别
1c1
< bool ReadImageToDatum(const string& filename, const int label,
---
> bool ReadImageToDatum(string& filename, const int label,
3a4,8
> /* dalyac addition to read/follow symlink if symlink*/
> char buf[200];
> if (readlink(filename.c_str(), buf, 200) > 0) {
> filename = std::string(buf);
> }
1c1
bool ReadImageToDatum(字符串和文件名,常量int标签,
3a4,8
>/*如果symlink,则将dalyac添加到读取/跟随symlink*/
>char-buf[200];
>if(readlink(filename.c_str(),buf,200)>0){
>filename=std::string(buf);
> }
我想说,在第一个论点中加上常数就是罪魁祸首
你应该能够通过将const添加到文件声明文件并重新编译……/p>如果信息不够清楚,我可以提供给我们的Mag文件;给我们看代码。你可以在修改之前编译它吗?“该函数仍然采用相同的参数并返回相同的内容,因此头文件中没有任何内容可修改。”-不正确,
const string&
和string&
不可互换。因此,如果它们不匹配,则说明您没有定义头文件中声明的函数,并且缺少的符号错误是正确的。