链接器失败,找不到包含在另一个目录中的文件的符号

时间:2020-04-22 00:43:11

标签: c++

我有以下文件:

..
├── subproject1
│   ├── main.cpp
│   ├── subproject1.cpp
│   └── subproject1.h
├── util.cpp
└── util.h

subproject1.h

#include <iostream>
#include "../util.h"

class SubProject1
{
public:
    SubProject1();
};

subproject1.cpp

#include "subproject1.h"

SubProject1::SubProject1() {
    std::cout << "var is " << VAR << "\n";
}

util.h

extern const int VAR;
extern const int ANOTHER_VAR;

util.cpp

const int VAR = 2;
const int ANOTHER_VAR = 3;

main.cpp

#include "subproject1.h"

int main() {
    SubProject1 project;
}

我可以通过执行以下操作来获取.o文件:

g++ -c ../util.cpp
g++ -c main.cpp
g++ -c subproject1.cpp

但是我不能通过以下方式获得可执行文件:

g++ -o main main.o subproject1.o util.o

相反,给出:

Undefined symbols for architecture x86_64:
  "_VAR", referenced from:
      SubProject1::SubProject1() in subproject1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我想念什么?

1 个答案:

答案 0 :(得分:0)

我相信您在class DefaultTasksRepository( private val tasksRemoteDataSource: TasksDataSource, private val tasksLocalDataSource: TasksDataSource, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, private val myCoroutineScope: CoroutineScope ) : TasksRepository { override suspend fun getTasks(forceUpdate: Boolean): Result<List<Task>> { // Set app as busy while this function executes. wrapEspressoIdlingResource { if (forceUpdate) { try { updateTasksFromRemoteDataSource(myCoroutineScope) } catch (ex: Exception) { return Result.Error(ex) } } return tasksLocalDataSource.getTasks() } } private suspend fun updateTasksFromRemoteDataSource(myCoroutineScope: CoroutineScope) { val remoteTasks = tasksRemoteDataSource.getTasks() if (remoteTasks is Success) { // Real apps might want to do a proper sync, deleting, modifying or adding each task. tasksLocalDataSource.deleteAllTasks() myCoroutineScope.launch { remoteTasks.data.forEach { task -> tasksLocalDataSource.saveTask(task) } } } else if (remoteTasks is Result.Error) { throw remoteTasks.exception } } ... } 文件中缺少#include "util.h"