我有以下文件:
..
├── 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)
我想念什么?
答案 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"