“Use MFC in a Static Library” -> CRT static

本文探讨了在Visual C++中MFC静态链接与CRT之间的兼容性问题,特别是在使用静态库时遇到的问题。讨论了MFC静态链接可能导致与其他动态链接库不兼容的情况,并考虑了动态链接MFC库作为解决方案的可能性。

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

VC “Use MFC in a Static Library” -> CRT static
CRT 动态就不能编译。
原因大概是MFC的静态连接库使用了静态CRT(runtime library)。

一般库的编译都是动态CRT,如wxWidgets库,
看来MFC应该动态连接才能与其它库相容。

MFC动态连接是否会造成目标机器因缺少DLL无法运行?
找了几个机器发现都可以运行。

查看一文:
VC下使用stl如何摆脱MSVCP60.dll?
98以上的系统就自带有MFC42.dll

不过DEBUG版是没有的。

另一问题:CRT动态库是否会缺?
msvcrt.dll可能都有。
msvcp60.dll可能没有!该DLL会用到吗?

所有库都为静态比较放心。
static inline const struct legacy_audio_device * to_cladev(const struct audio_hw_device *dev) 416 { 417 return reinterpret_cast<const struct legacy_audio_device *>(dev); 418 } 419 420 static int adev_init_check(const struct audio_hw_device *dev) 421 { 422 const struct legacy_audio_device *ladev = to_cladev(dev); 423 424 return ladev->hwif->initCheck(); 425 } 426 427 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume) 428 { 429 struct legacy_audio_device *ladev = to_ladev(dev); 430 return ladev->hwif->setVoiceVolume(volume); 431 } 432 433 static int adev_set_master_volume(struct audio_hw_device *dev, float volume) 434 { 435 struct legacy_audio_device *ladev = to_ladev(dev); 436 return ladev->hwif->setMasterVolume(volume); 437 } 438 439 static int adev_get_master_volume(struct audio_hw_device *dev, float* volume) 440 { 441 struct legacy_audio_device *ladev = to_ladev(dev); 442 return ladev->hwif->getMasterVolume(volume); 443 } 444 445 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode) 446 { 447 struct legacy_audio_device *ladev = to_ladev(dev); 448 // as this is the legacy API, don't change it to use audio_mode_t instead of int 449 return ladev->hwif->setMode((int) mode); 450 } 451 452 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) 453 { 454 struct legacy_audio_device *ladev = to_ladev(dev); 455 return ladev->hwif->setMicMute(state); 456 } 457 458 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state) 459 { 460 const struct legacy_audio_device *ladev = to_cladev(dev); 461 return ladev->hwif->getMicMute(state); 462 } 463 464 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) 465 { 466 struct legacy_audio_device *ladev = to_ladev(dev); 467 return ladev->hwif->setParameters(String8(kvpairs)); 468 } 469 470 static char * adev_get_parameters(const struct audio_hw_device *dev, 471 const char *keys) 472 { 473 const struct legacy_audio_device *ladev = to_cladev(dev); 474 String8 s8; 475 476 s8 = ladev->hwif->getParameters(String8(keys)); 477 return strdup(s8.string()); 478 } 479 480 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev, 481 const struct audio_config *config) 482 { 483 const struct legacy_audio_device *ladev = to_cladev(dev); 484 return ladev->hwif->getInputBufferSize(config->sample_rate, (int) config->format, 485 audio_channel_count_from_in_mask(config->channel_mask)); 486 } 487 488 static int adev_open_output_stream(struct audio_hw_device *dev, 489 audio_io_handle_t handle, 490 audio_devices_t devices, 491 audio_output_flags_t flags, 492 struct audio_config *config, 493 struct audio_stream_out **stream_out, 494 const char *address __unused) 495 { 496 struct legacy_audio_device *ladev = to_ladev(dev); 497 status_t status; 498 struct legacy_stream_out *out; 499 int ret; 500 501 out = (struct legacy_stream_out *)calloc(1, sizeof(*out)); 502 if (!out) 503 return -ENOMEM; 504 505 devices = convert_audio_device(devices, HAL_API_REV_2_0, HAL_API_REV_1_0); 506 507 out->legacy_out = ladev->hwif->openOutputStreamWithFlags(devices, flags, 508 (int *) &config->format, 509 &config->channel_mask, 510 &config->sample_rate, &status); 511 if (!out->legacy_out) { 512 ret = status; 513 goto err_open; 514 } 515 516 out->stream.common.get_sample_rate = out_get_sample_rate; 517 out->stream.common.set_sample_rate = out_set_sample_rate; 518 out->stream.common.get_buffer_size = out_get_buffer_size; 519 out->stream.common.get_channels = out_get_channels; 520 out->stream.common.get_format = out_get_format; 521 out->stream.common.set_format = out_set_format; 522 out->stream.common.standby = out_standby; 523 out->stream.common.dump = out_dump; 524 out->stream.common.set_parameters = out_set_parameters; 525 out->stream.common.get_parameters = out_get_parameters; 526 out->stream.common.add_audio_effect = out_add_audio_effect; 527 out->stream.common.remove_audio_effect = out_remove_audio_effect; 528 out->stream.get_latency = out_get_latency; 529 out->stream.set_volume = out_set_volume; 530 out->stream.write = out_write; 531 out->stream.get_render_position = out_get_render_position; 532 out->stream.get_next_write_timestamp = out_get_next_write_timestamp; 533 534 *stream_out = &out->stream; 535 return 0; 536 537 err_open: 538 free(out); 539 *stream_out = NULL; 540 return ret; 541 } 542 543 static void adev_close_output_stream(struct audio_hw_device *dev, 544 struct audio_stream_out* stream) 545 { 546 struct legacy_audio_device *ladev = to_ladev(dev); 547 struct legacy_stream_out *out = reinterpret_cast<struct legacy_stream_out *>(stream); 548 549 ladev->hwif->closeOutputStream(out->legacy_out); 550 free(out); 551 } 552 553 /** This method creates and opens the audio hardware input stream */ 554 static int adev_open_input_stream(struct audio_hw_device *dev, 555 audio_io_handle_t handle, 556 audio_devices_t devices, 557 struct audio_config *config, 558 struct audio_stream_in **stream_in, 559 audio_input_flags_t flags __unused, 560 const char *address __unused, 561 audio_source_t source __unused) 562 { 563 struct legacy_audio_device *ladev = to_ladev(dev); 564 status_t status; 565 struct legacy_stream_in *in; 566 int ret; 567 568 in = (struct legacy_stream_in *)calloc(1, sizeof(*in)); 569 if (!in) 570 return -ENOMEM; 571 572 devices = convert_audio_device(devices, HAL_API_REV_2_0, HAL_API_REV_1_0); 573 574 in->legacy_in = ladev->hwif->openInputStream(devices, (int *) &config->format, 575 &config->channel_mask, &config->sample_rate, 576 &status, (AudioSystem::audio_in_acoustics)0); 577 if (!in->legacy_in) { 578 ret = status; 579 goto err_open; 580 } 581 582 in->stream.common.get_sample_rate = in_get_sample_rate; 583 in->stream.common.set_sample_rate = in_set_sample_rate; 584 in->stream.common.get_buffer_size = in_get_buffer_size; 585 in->stream.common.get_channels = in_get_channels; 586 in->stream.common.get_format = in_get_format; 587 in->stream.common.set_format = in_set_format; 588 in->stream.common.standby = in_standby; 589 in->stream.common.dump = in_dump; 590 in->stream.common.set_parameters = in_set_parameters; 591 in->stream.common.get_parameters = in_get_parameters; 592 in->stream.common.add_audio_effect = in_add_audio_effect; 593 in->stream.common.remove_audio_effect = in_remove_audio_effect; 594 in->stream.set_gain = in_set_gain; 595 in->stream.read = in_read; 596 in->stream.get_input_frames_lost = in_get_input_frames_lost; 597 598 *stream_in = &in->stream; 599 return 0; 600 601 err_open: 602 free(in); 603 *stream_in = NULL; 604 return ret; 605 }
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值