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&
不可互换。因此,如果它们不匹配,则说明您没有定义头文件中声明的函数,并且缺少的符号错误是正确的。