C++创建HelloWorld项目测试

本文详细介绍了如何从创建一个C++的gRPC_Server空项目开始,逐步添加必要文件,配置编译环境,解决依赖问题,直至成功运行。主要步骤包括拷贝项目文件、生成protobuf文件、设置项目属性、处理编译错误,并最终成功编译运行gRPC服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 空模板创建项目

创建一个C++空项目gRPC_Server, 本例使用Debug模式编译

二、拷贝项目文件

拷贝文件到gRPC_Server所在的目录中

  1. D:\GRPCProject\gRPC_Project\grpc\examples\protos 中 helloworld.proto
  2. D:\GRPCProject\gRPC_Project\grpc\examples\cpp\helloworld中greeter_client.cc 和 greeter_server.cc
  3. D:\GRPCProject\gRPC_Project\grpc_install\bin 中 proto.exe 和 zlibd.dll
  4. D:\GRPCProject\gRPC_Project\grpc\.build\Debug 中 grpc_cpp_plugin.exe

三.  生成pb文件

cmd中输入如下命令,生成4个pb文件:

protoc.exe --grpc_out=. --plugin=protoc-gen-grpc=grpc_cpp_plugin.exe helloworld.proto

protoc.exe --cpp_out=. helloworld.proto

 四.  设置项目属性

把文件关联到项目中:

拷贝相关依赖包,使得项目能够独立运行:

  1. 创建文件夹depends, 子文件grpc 和 third_party
  2. 将D:\GRPCProject\gRPC_Project\grpc\include 和 D:\GRPCProject\gRPC_Project\grpc\third_party\protobuf\src 拷贝到 grpc文件中去
  3. 将下面文件夹中文件拷贝到third_party目录中:

                        D:\GRPCProject\gRPC_Project\grpc\.build\Debug

                        D:\GRPCProject\gRPC_Project\grpc\.build\third_party\cares\cares\lib\Debug

                        D:\GRPCProject\gRPC_Project\grpc\.build\third_party\zlib\Debug

                        D:\GRPCProject\gRPC_Project\grpc\.build\third_party\protobuf\Debug

4.1 【c/c++】-【常规】-【附件包含目录】

D:\GRPCProject\gRPC_Project\gRPC_Server\gRPC_Server\depends\grpc\include

D:\GRPCProject\gRPC_Project\gRPC_Server\gRPC_Server\depends\grpc\protobuf\src

4.2 【c/c++】-【预处理器】-【预处理器定义】 

添加:_WIN32_WINNT=0x0A00

 4.3 【链接器】-【常规】-【附加库目录】

D:\GRPCProject\gRPC_Project\gRPC_Server\gRPC_Server\depends\third_party

4.4 【链接器】-【输入】-【附加依赖项】

libprotobufd.lib

grpc.lib

grpc++.lib

gpr.lib

Ws2_32.lib

zlibd.lib

cares.lib

address_sorting.lib

 五.  编译项目

1.报错:E1696 无法打开 源 文件 "absl/synchronization/mutex.h",意思是缺少相关的头文件,进行头文件的添加。

解决:复制D:\GRPCProject\gRPC_Project\grpc\third_party\abseil-cpp下的文件到grpc.

 然后【c/c++】-【常规】-【附件包含目录】

2.再次点击运行,报错为:LNK2001  无法解析的外部符号 "public: __cdecl absl::Mutex::~Mutex(void)"

意思是:缺少头文件依赖的文件函数

解决:把D:\GRPCProject\gRPC_Project\grpc_install\lib路径下所以的lib文件拷贝到grpc third_party中,【链接器】-【输入】-【附加依赖项】中添加所以拷贝过去的文件名。

文件名太多,不想一个个复制,用python进行获取文件名:

import os
num = 0
for filename in os.listdir(r"D:\GRPCProject\gRPC_Project\grpc_install\lib"):
    if filename.endswith(".lib"):
        num += 1
        print(filename)
print(num)

 

获取的文件名为:

absl_bad_any_cast_impl.lib

absl_bad_optional_access.lib

absl_bad_variant_access.lib

absl_base.lib

absl_city.lib

absl_civil_time.lib

absl_cord.lib

absl_cordz_functions.lib

absl_cordz_handle.lib

absl_cordz_info.lib

absl_cordz_sample_token.lib

absl_cord_internal.lib

absl_debugging_internal.lib

absl_demangle_internal.lib

absl_examine_stack.lib

absl_exponential_biased.lib

absl_failure_signal_handler.lib

absl_flags.lib

absl_flags_commandlineflag.lib

absl_flags_commandlineflag_internal.lib

absl_flags_config.lib

absl_flags_internal.lib

absl_flags_marshalling.lib

absl_flags_parse.lib

absl_flags_private_handle_accessor.lib

absl_flags_program_name.lib

absl_flags_reflection.lib

absl_flags_usage.lib

absl_flags_usage_internal.lib

absl_graphcycles_internal.lib

absl_hash.lib

absl_hashtablez_sampler.lib

absl_int128.lib

absl_leak_check.lib

absl_leak_check_disable.lib

absl_log_severity.lib

absl_low_level_hash.lib

absl_malloc_internal.lib

absl_periodic_sampler.lib

absl_random_distributions.lib

absl_random_internal_distribution_test_util.lib

absl_random_internal_platform.lib

absl_random_internal_pool_urbg.lib

absl_random_internal_randen.lib

absl_random_internal_randen_hwaes.lib

absl_random_internal_randen_hwaes_impl.lib

absl_random_internal_randen_slow.lib

absl_random_internal_seed_material.lib

absl_random_seed_gen_exception.lib

absl_random_seed_sequences.lib

absl_raw_hash_set.lib

absl_raw_logging_internal.lib

absl_scoped_set_env.lib

absl_spinlock_wait.lib

absl_stacktrace.lib

absl_status.lib

absl_statusor.lib

absl_strerror.lib

absl_strings.lib

absl_strings_internal.lib

absl_str_format_internal.lib

absl_symbolize.lib

absl_synchronization.lib

absl_throw_delegate.lib

absl_time.lib

absl_time_zone.lib

address_sorting.lib

cares.lib

crypto.lib

gpr.lib

grpc++.lib

grpc++_alts.lib

grpc++_error_details.lib

grpc++_reflection.lib

grpc++_unsecure.lib

grpc.lib

grpcpp_channelz.lib

grpc_plugin_support.lib

grpc_unsecure.lib

libprotobuf-lited.lib

libprotobufd.lib

libprotocd.lib

re2.lib

ssl.lib

upb.lib

zlibd.lib

zlibstaticd.lib

文件名添加后,重新运行,成功!

### C++ Main 函数必须返回整数类型的解决方案 在C++标准中,`main`函数作为程序的入口点,默认情况下应该返回一个 `int` 类型的结果给操作系统。如果未显式指定返回值或者返回了一个非整数值,则可能会引发编译器警告或错误。 #### 错误原因分析 当编写C++程序时,如果没有为 `main` 函数提供明确的返回值类型(通常是 `int`),某些编译器会发出警告甚至拒绝编译代码。这是因为ISO/IEC 14882:2017(C++17标准)明确规定了 `main` 函数的行为:它可以隐含地返回零[^2],但这仅限于没有显式的 `return` 语句的情况下。然而,在实际开发环境中,许多现代编译器仍然期望开发者显式声明并返回一个整数值来表示程序执行的状态。 #### 解决方案 为了消除此类错误,可以采取以下措施之一: 1. **确保 main 返回 int 并包含 return 语句** 修改源码使得 `main()` 明确返回一个整数,通常惯例是成功完成操作后返回 `0` 表示无错误退出状态。 ```cpp #include <iostream> using namespace std; int main() { cout << "Program executed successfully." << endl; return 0; // 正常结束标志 } ``` 2. **利用默认行为 (适用于特定情况)** 如果确实不需要任何自定义逻辑处理,并且使用的环境支持这种简化形式,则可以直接依赖省略版写法——即不写出具体的 `return` 关键字。注意这种方法并非所有场合都适用,尤其是严格遵循最新标准或跨平台移植性强的应用场景下可能存在问题。 ```cpp #include <iostream> using namespace std; int main(){ cout<<"Hello World!"; }// 隐式返回0 ``` 3. **调整编译选项** 对于部分老旧版本或其他特殊需求下的工具链配置而言,可以通过设置额外参数允许更宽松语法解析模式从而绕过上述限制条件;不过一般建议优先考虑前两种方式以保持良好习惯以及兼容性最大化。 以上就是针对"C++ main function must return int error"这一常见问题的具体解释及其对应修正策略[^5]。 ```cpp #include <iostream> using namespace std; // Example demonstrating proper use of 'main' returning an integer value. int main() { try{ // Your program logic here... cout << "Execution completed without errors."; return EXIT_SUCCESS; // Standard macro defined as zero indicating success. }catch(...){ cerr << "An unexpected exception occurred during execution!" ; return EXIT_FAILURE; // Non-zero code signaling failure status upon termination. } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值